2011-05-23 24 views
5

¿Esto es posible?MySQL: ACTUALIZAR con un JOIN y un GROUP_CONCAT

Tengo 2 tablas, clientes y pedidos. Ahora quiero completar una columna en Clientes con todos los ID de pedido de ese cliente (separados por comas).

he intentado algo como esto, pero no funciona:

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

recibo el mensaje 'Uso no válido de función de grupo'.

PS. Sé que es mejor obtener siempre dinámicamente los valores GROUP_CONCAT en SELECT/JOIN, pero me pregunto si puedo llenar esta columna de alguna manera.

Respuesta

-1

Olvidaste decir la cláusula 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

No creo que ese sea el problema. Puede usar GROUP_CONCAT sin especificar GROUP BY. Además, sigue dando un error cuando intento esto. – Dylan

+0

group_concat no funciona en la actualización sin subconsulta. –

1

Básicamente, usted no debe utilizar la función GROUP_CONCAT de esta manera, esa no es la manera correcta de hacer su trabajo.

En este caso, puede utilizar el enfoque de consultas anidadas en lugar de intentar con JOIN como he especificado a continuación, intente esta consulta, con suerte, esto debería hacer su trabajo correctamente.

 
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); 

Pruebe esta consulta una vez y hágamelo saber si tiene más problemas.

Siva

6

Usted tendrá que añadir una orden en el GROUP_CONCAT como se muestra en el siguiente ejemplo

Nota: GROUP_CONCAT (versión ORDER BY versión SEPARADOR '')

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

Necesitará colocar la subconsulta dentro de otra subconsulta; de lo contrario, obtendrá ** No puede especificar la tabla de destino 'tablename' para la actualización en la cláusula FROM ** - [vea esto] (http://stackoverflow.com/questions/12475850/how-can-an-sql-query-return-data-from-multiple-tables/12508381 # 12508381) para más detalles. – Fluffeh

0

Ninguna de las respuestas dadas aquí me funcionaba, posiblemente porque mi caso era más complicado (necesitaba más de una combinación), así que utilicé la solución de Dennis pero la dividí en una tabla temporal:

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;