2015-05-27 19 views
0

我创建了一个SQL Fiddle来说明我想在这里做什么。我有一个名为“项目”的表格,其中包含个人信息和汇总信息。有一个名为“keycode”的列表示该项目的单个数据片段。有一个名为“促销”的专栏,用于将事情分组在一起。如何在MySQL中使用GROUP BY和JOIN更新每个分组行?

我还有另一个名为“keycodes”(注意S)的列,我想要包含同一个促销的键码的逗号分隔列表。因此,例如,如果有三行带有促销“A”,并且它们对于“keycode”列的各个值是ABC,DEF和GHI,那么我会将这三行中的所有三行的值设为相同的值为“keycodes”列。即:ABC,DEF,GHI

我试着用UPDATE语句来做这件事;然而,这仅更新分组行一个

UPDATE items i 
INNER JOIN (
    SELECT keycode, GROUP_CONCAT(keycode SEPARATOR ',') AS keycodes 
    FROM items 
    WHERE promo IS NOT NULL 
    GROUP BY promo 
) AS t ON i.keycode = t.keycode 
SET i.keycodes = t.keycodes; 

所以在我SQL Fiddle,该行与ID为1和4正确更新(和技术上5太多,但只是因为它只有一个值)。但是,ID为2,3和6的行没有我想要的值。

这是可以在MySQL中完成的事情吗?

所需的输出:

+----+---------+-------------+-------+ 
| id | keycode | keycodes | promo | 
+----+---------+-------------+-------+ 
| 1 | ABC  | ABC,DEF,GHI | A  | 
| 2 | GHI  | ABC,DEF,GHI | A  | 
| 3 | DEF  | ABC,DEF,GHI | A  | 
| 4 | QRS  | QRS,TUV  | B  | 
| 5 | WXY  | WXY   | C  | 
| 6 | TUV  | QRS,TUV  | B  | 
+----+---------+-------------+-------+ 

回答

1

使用此更新查询以获得期望的结果: -

UPDATE items i 
INNER JOIN (
      SELECT keycode, GROUP_CONCAT(keycode SEPARATOR ',') AS keycodes, promo 
      FROM items 
      WHERE promo IS NOT NULL 
      GROUP BY promo 
      ) AS t ON i.promo = t.promo 
SET i.keycodes = t.keycodes;