2011-05-23 83 views
5

这可能吗?MySQL:使用JOIN和GROUP_CONCAT进行更新

我有2个表,客户和订单。现在我想填写顾客的一个专栏,该顾客的所有订单编号(逗号分隔)。

我想这样的事情,但它不工作:

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 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 
+0

我不认为这是问题所在。您可以使用GROUP_CONCAT而不指定GROUP BY。另外,当我尝试这个时,它仍然会出现错误。 – Dylan 2011-05-23 16:15:54

+0

group_concat不工作在没有子查询的更新中。 – 2014-04-17 20:42:56

1

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

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

 
UPDATE customers AS c 
SET c.orders = 
(SELECT GROUP_CONCAT(DISTINCT o.orderid) 
FROM orders AS o 
WHERE o.customerid = c.customerid 
GROUP BY o.customerid); 

试试此查询一次,然后让我知道你是否面临任何更多的问题。

湿婆

6

您将需要通过在GROUP_CONCAT添加的顺序显示在下面的例子中

注:GROUP_CONCAT(版本ORDER BY版本分离器 '')

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 
+0

您需要将子查询放在另一个子查询中,否则您将得到**您无法在FROM子句中指定目标表“tablename”进行更新** - [请参阅此处](http://stackoverflow.com/questions/12475850/how-can-an-sql-query-return-data-from-multiple-tables/12508381#12508381)了解更多详情。 – Fluffeh 2012-09-27 11:02:03

0

这里给出的答案都没有为我工作,可能是因为我的情况更复杂(我需要多个连接),所以我使用了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;