2011-05-23 136 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;