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 多表连接查询 inner join 和 outer join 的使用