MySQL: ОБНОВЛЕНИЕ с JOIN и GROUP_CONCAT - PullRequest
6 голосов
/ 23 мая 2011

Возможно ли это?

У меня есть 2 таблицы: клиенты и заказы.Теперь я хочу заполнить столбец в Клиенты всеми идентификаторами заказа этого клиента (через запятую).

Я пробовал что-то подобное, но это не работает:

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

Я получаю «Неправильное использование групповой функции».

PS.Я знаю, что лучше всегда динамически получать значения GROUP_CONCAT в SELECT / JOIN, но мне просто интересно, могу ли я каким-то образом заполнить этот столбец.

Ответы [ 4 ]

8 голосов
/ 26 августа 2012

Вам необходимо добавить заказ в group_concat, как показано в примере ниже

Примечание: group_concat (версия ORDER BY версия 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
2 голосов
/ 16 ноября 2012

Ни один из приведенных здесь ответов не работал для меня, возможно, из-за того, что мой случай был более сложным (мне потребовалось более одного объединения), поэтому я использовал решение Денниса, но разбил его на временную таблицу:

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;
1 голос
/ 18 июня 2012

По сути, вы не должны использовать функцию 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);

Попробуйте этот запрос один раз, а затем дайте мне знать, если у вас возникнут какие-либо проблемы.

Сива

0 голосов
/ 23 мая 2011

Вы забыли сообщить предложение 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
...