【问题标题】:issues with mysql GROUP_CONCAT and INSERT into another tablemysql GROUP_CONCAT 和 INSERT 到另一个表的问题
【发布时间】:2012-05-07 13:07:52
【问题描述】:

我有一个 MySQL GROUP_CONCAT .... INSERT 问题 此代码有效:

    SELECT group_concat(tabel2.img_name separator ',') 
    FROM tabel2 
    GROUP BY tabel2.produit_id 

我需要将结果插入到另一个表中,但我卡住了。

这个(或我能想到的任何组合)都行不通

    INSERT INTO tabel1.imgname
    SELECT group_concat(tabel2.img_name separator ',') 
    FROM tabel2 
    GROUP BY tabel2.produit_id 
    WHERE tabel1.product_id = tabel2.produit_id

我做错了什么?

CREATE TABLE IF NOT EXISTS `tabel1` (
  `product_id` int(11) NOT NULL AUTO_INCREMENT,
  `rubrique_id` int(11) NOT NULL,
  `marque_id` int(11) NOT NULL,
  `subfamily_id` int(11) NOT NULL,
  `product_name` varchar(150) NOT NULL,
  `imgname` varchar(255) DEFAULT NULL,
  `product_description1` text NOT NULL,
  `product_description2` text NOT NULL,
  `product_order` int(11) NOT NULL,
  `product_page` int(11) NOT NULL,
  `price_min` float NOT NULL,
  PRIMARY KEY (`product_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=0;


    INSERT INTO `tabel1` (`product_id`, `rubrique_id`, `marque_id`, `subfamily_id`, `product_name`, `imgname`, `product_description1`, `product_description2`, `product_order`, `product_page`, `price_min`) 
VALUES
(33, 15, 23, 40, 'product 1', NULL, '', '', 0, 0, 0),
(34, 13, 13, 13, 'product 2', NULL, '', '', 0, 0, 0),
(35, 14, 14, 14, 'product 3', NULL, '', '', 0, 0, 0);



CREATE TABLE IF NOT EXISTS `tabel2` (
  `img_id` int(11) NOT NULL AUTO_INCREMENT,
  `img_name` text NOT NULL,
  `article_id` int(11) DEFAULT NULL,
  `produit_id` int(11) DEFAULT NULL,
  `product_select` tinyint(1) DEFAULT NULL,
  PRIMARY KEY (`img_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=4018 ;

INSERT INTO `tabel2` (`img_id`, `img_name`, `article_id`, `produit_id`, `product_select`) 
VALUES
(4013, 'acoacki086050.jpg', 13342, 33, NULL),
(4014, '32252il6jh2dqex.jpg', NULL, 34, NULL),
(4015, '33265ulrzmgr18w.jpg', NULL, 34, NULL),
(4016, '40334zcfk0c4n67.jpg', NULL, 35, NULL),
(4017, '40473frd4900u82.jpg', NULL, 35, NULL);

所以说 tabel1.product_id = 34 我需要有 tabel1.imgname = 32252il6jh2dqex.jpg,33265ulrzmgr18w.jpg

【问题讨论】:

  • 请提供 tabel1 和 tabel2 的完整架构,以及您希望查询执行的操作的说明。
  • 我刚才看到了评论,我已经用上述表格和我需要做的事情更新了我的帖子。更糟糕的是,我会将 concat 导出为 csv,然后仅从 csv 文件更新该列。但我非常不想这样做,特别是因为桌子真的很大
  • 你不想要INSERT,你可能想要UPDATE
  • 只要能完成工作,我将使用什么并不重要。 UPDATE也没有用,我试过了。
  • 感谢架构和要求。这很有帮助。我已经通过回答更新了一个适合您的查询。

标签: mysql insert group-concat insert-update


【解决方案1】:

你描述的是UPDATE。不是INSERT:

UPDATE
    tabel1 AS t1
  JOIN
    ( SELECT produit_id
           , GROUP_CONCAT(img_name SEPARATOR ',') AS grp_img_name
      FROM tabel2 
      GROUP BY produit_id
    ) AS t2
        ON t2.produit_id = t1.product_id
SET
    t1.imgname = t2.grp_img_name ;

随机咆哮:

为什么,为什么,为什么你有这些table1tabel1tabel2tableX 名字?任何对象(表、列、索引、约束、数据库)的名称都应反映使用情况。
table1 什么都不说。
tabel1 什么都不说,只是你不拼写检查你的名字。

在外键约束中使用的列(以及作为连接的结果)具有相同的名称(如果可能)是一种很好的做法。不是imgname 在一张表中,img_name 在另一张表中。不是produit_id 在一个和product_id 在另一个。它可以帮助你,下一个程序员和试图帮助你解决 SO 的人,不要在写 ON t2.produit_id = t1.produit_id 时出错。如果您喜欢 USING (product_id) 语法而不是 ON 连接语法,它也会有所帮助。

(更新)
似乎不同的名称是因为表来自不同的源/数据库,这不是您的选择。如果您有很多工作要做,我建议您将它们更改为具有统一/合理的名称。如果这是一次性工作,只是为了传输/转换一些数据,请不要打扰。

【讨论】:

  • 现在我收到此错误:#1046 - 未选择数据库。但我将继续尝试使用 JOIN 并看看它是如何从这里开始的。谢谢
  • 不,这太容易了。添加 db_name.tabel1 和 db_name.tabel2 会导致 #1054 - 'on Clause' 中的未知列 't1.produit_id'。进一步添加 db_name.t1 和 db_name.t2 会导致 #1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 2 行的 '.t1 JOIN ( SELECT produit_id , GROUP_CONCAT(img_name SEPARAT' ) 附近使用正确的语法
  • ON t2.produit_id = t1.produit_id改成ON t2.produit_id = t1.product_id就可以了。
  • ON t2.produit_id = t1.produit_id 应该是 ON t2.produit_id = t1.product_id,当然还有 db_name.tabel1 和 db_name.tabel2。哇非常感谢!我很高兴大声笑
  • 是的,我又读了一遍,我看到了。请更新您的帖子,以便它显示正确的答案,以防其他人需要同样的东西。
【解决方案2】:

我认为这就是你想要做的:

INSERT INTO tabel1 (product_id,imgname)
SELECT tabel2.produit_id, group_concat(tabel2.img_name separator ',') as imgname
FROM tabel2 
GROUP BY tabel2.produit_id  

更新:感谢您发布架构并阐明要求。

这应该适合你:

UPDATE tabel1
INNER JOIN 
(
SELECT tabel2.produit_id, group_concat(tabel2.img_name separator ',') AS imgname
FROM tabel2 
GROUP BY tabel2.produit_id 
) s ON s.produit_id = tabel1.product_id
SET tabel1.imgname = s.imgname;

【讨论】:

  • 我已经有了 tabel1(product_id)。而且我需要使用从 GROUP_CONCAT 获得的任何结果来更新(?也许)tabel1(imgname),应用 WHERE 子句
  • 我收到错误 #1046 - 您的解决方案和 ypercube 的解决方案都没有选择数据库。我开始觉得有点傻。就像我离我需要做的事情只有 1 英寸,但我看不到它。
  • 按照 ypercube 的建议,先运行这个:USE db_name;
  • 是的,它奏效了。我在添加 db_name 时犯了一个错误,(当然)它没有立即工作。我应该在一段时间前,在一个合理的时间,在我头脑清醒的时候发布我的问题。感谢您的所有帮助:)
【解决方案3】:

您没有指定要插入的值

INSERT INTO tabel1.imgname
SELECT group_concat(tabel2.img_name separator ',') 
FROM tabel2 
GROUP BY tabel2.produit_id 
WHERE tabel1.product_id = tabel2.produit_id
VALUES('','')

【讨论】:

  • 该语法无效。 INSERT...SELECTINSERT...VALUES 是互斥的。
猜你喜欢
  • 1970-01-01
  • 2014-01-25
  • 1970-01-01
  • 2021-01-30
  • 2010-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多