我可以使用GROUP_CONCAT更新表吗?

时间:2012-03-27 12:21:34

标签: mysql

我可以使用GROUP_CONCAT更新表吗?我有2张桌子 我

d    |  label
------------------------------
1     | ravi,rames,raja
------------------------------
2     |     ravi
------------------------------
3     | ravi,raja
------------------------------
4     | null
------------------------------
5     | null
------------------------------
6     | rames
------------------------------
and 
id    | values
------------------------------
12    | raja
------------------------------
13    | rames
------------------------------
14    | ravi
------------------------------

我希望结果如下表 -

id    | label
------------------------------
1     | 12,13,14
------------------------------
2     |     14
------------------------------
3     | 14,12
------------------------------
4     | null
------------------------------
5     | null
------------------------------
6     | 13
------------------------------

但是使用以下查询 -

SELECT `table1`.`id`, GROUP_CONCAT(`table2`.`id` ORDER BY `table2`.`id`) AS label
FROM `table1`
JOIN `table2` ON FIND_IN_SET(`table2`.`values`, `table1`.`nos`) 
GROUP BY `table1`.`id`;

我得到了 -

id    | label
------------------------------
1     | 12,13,14
------------------------------
2     | 14
------------------------------
3     | 12,14
------------------------------
6     | 13
------------------------------

我想保留空值。否则行的顺序将被打破。请帮忙。 对不起大字体:(

1 个答案:

答案 0 :(得分:6)

您只需要LEFT JOIN来保留空值:

SELECT `table1`.`id`, GROUP_CONCAT(`table2`.`id` ORDER BY `table2`.`id`) AS label
FROM `table1`
LEFT JOIN `table2` ON FIND_IN_SET(`table2`.`values`, `table1`.`nos`) 
GROUP BY `table1`.`id`;

但是,我建议不要更新表以在列中包含逗号分隔值。它会强制您在查询时使用FIND_IN_SET(),并且会破坏索引列的能力,从而影响查询的性能。更可持续的行动是规范化table1,使其不包含以逗号分隔的列。

更新

要在GROUP_CONCAT()语句中使用UPDATE,您可以使用如下语法。替换正确的表和列名,在您的情况下,您可能希望用SELECT语句替换整个JOIN子查询。

UPDATE 
  tbl_to_update
  JOIN (SELECT id, GROUP_CONCAT(concatcolumn) AS label FROM tbl GROUP BY id) tbl_concat
     ON tbl_to_update.id = tbl_concat.id
SET tbl_to_update.column_to_update = tbl_concat.label 
WHERE <where condition>

所以在你的情况下:

UPDATE
   table1 
   INNER JOIN (SELECT id, GROUP_CONCAT(id) AS label FROM table1 GROUP BY id) table2
      ON FIND_IN_SET(`table2`.`label`, `table1`.`nos`) 
SET table1.nos = table2.id