MySQL:使用 JOIN 和 GROUP_CONCAT 进行更新

Posted

技术标签:

【中文标题】MySQL:使用 JOIN 和 GROUP_CONCAT 进行更新【英文标题】:MySQL: UPDATE with a JOIN and a GROUP_CONCAT 【发布时间】:2011-08-31 06:55:45 【问题描述】:

这可能吗?

我有 2 个表,客户和订单。现在我想用该客户的所有订单 ID(逗号分隔)填充客户中的一列。

我尝试了类似的方法,但它不起作用:

UPDATE customers AS c
LEFT JOIN orders AS o ON o.customerid=c.customerid
SET c.orders = GROUP_CONCAT(DISTINCT o.orderid)

我得到'无效使用组功能'。

PS。我知道最好总是在 SELECT/JOIN 中动态获取 GROUP_CONCAT 值,但我只是想知道是否可以以某种方式填充此列。

【问题讨论】:

【参考方案1】:

您需要在 group_concat 中添加 order by,如下例所示

注意:group_concat(version ORDER BY version SEPARATOR ',')

UPDATE 
items i,
(SELECT pduid, group_concat(version ORDER BY version SEPARATOR ',') AS 'versions'
     from items GROUP BY pduid) AS version_lookup
SET i.versions = version_lookup.versions
WHERE version_lookup.pduid = i.pduid

【讨论】:

您需要将子查询放在另一个子查询中,否则您将得到 您无法在 FROM 子句中指定目标表 'tablename' 进行更新 - see this for更多细节。【参考方案2】:

这里给出的答案都不适合我,可能是因为我的情况更复杂(我需要多个连接),所以我使用了 Dennis 的解决方案,但将其拆分为一个临时表:

CREATE TEMPORARY TABLE version_lookup
SELECT pduid, group_concat(version ORDER BY version SEPARATOR ',') AS 'versions'
     from items GROUP BY pduid;

UPDATE 
items i, version_lookup
SET i.versions = version_lookup.versions
WHERE version_lookup.pduid = i.pduid;

【讨论】:

【参考方案3】:

基本上你不应该以这种方式使用 GROUP_CONCAT 函数,这不是完成工作的正确方法。

在这种情况下,您可以使用嵌套查询方法,而不是像我在下面指定的那样尝试使用 JOIN,试试这个查询,希望这能正确完成您的工作。

更新客户作为 c SET c.orders = (SELECT GROUP_CONCAT(DISTINCT o.orderid) 从订单 AS o WHERE o.customerid = c.customerid GROUP BY o.customerid);

尝试此查询一次,如果您遇到任何问题,请告诉我。

湿婆

【讨论】:

【参考方案4】:

您忘记告诉 GROUP BY 子句。

UPDATE customers AS c
LEFT JOIN orders AS o ON o.customerid=c.customerid
SET c.orders = GROUP_CONCAT(DISTINCT o.orderid)
GROUP BY o.customerid

【讨论】:

我认为这不是问题所在。您可以在不指定 GROUP BY 的情况下使用 GROUP_CONCAT。另外,当我尝试这个时它仍然会出错。

以上是关于MySQL:使用 JOIN 和 GROUP_CONCAT 进行更新的主要内容,如果未能解决你的问题,请参考以下文章

Mysql的join语句

为什么MySQL不推荐使用子查询和join

Mysql 多表连接查询 inner join 和 outer join 的使用

mysql的unionleft join right join inner join和视图学习

MySQL 使用 JOIN 和 GROUP_CONCAT

MySQL:使用 JOIN 和 GROUP_CONCAT 进行更新