¿Cómo puedo concatenar cadenas de una subconsulta en una sola fila en mysql?
-
30-09-2019 - |
Pregunta
Tengo tres tablas:
table "package"
-----------------------------------------------------
package_id int(10) primary key, auto-increment
package_name varchar(255)
price decimal(10,2)
table "zones"
------------------------------------------------------
zone_id varchar(32) primary key (ex of data: A1, Z2, E3, etc)
table "package_zones"
------------------------------------------------------
package_id int(10)
zone_id varchar(32)
Lo que estoy tratando de hacer es volver toda la información en la tabla paquete más una lista de las zonas correspondientes a ese paquete. Quiero la lista de zonas ordenadas alfabéticamente y separados por comas.
Así que la salida que estoy buscando es algo como esto ...
+------------+---------------+--------+----------------+
| package_id | package_name | price | zone_list |
+------------+---------------+--------+----------------+
| 1 | Red Package | 50.00 | Z1,Z2,Z3 |
| 2 | Blue Package | 75.00 | A2,D4,Z1,Z2 |
| 3 | Green Package | 100.00 | B4,D1,D2,X1,Z1 |
+------------+---------------+--------+----------------+
Sé que podría hacer algo en PHP con la capa de presentación para obtener el resultado deseado. El problema es, me gustaría ser capaz de ordenar ASC o DESC zone_list o uso incluso "DONDE zone_list LIKE" y así sucesivamente. Con el fin de hacer eso, necesito esto se haga en MySQL.
No tengo idea de cómo empezar siquiera para hacer frente a esto. He intentado utilizar una subconsulta, pero seguía quejándose de varias filas. Probé a concat las múltiples filas en una sola cadena, pero es evidente que MySQL no le gusta esto.
Gracias de antemano.
ACTUALIZACIÓN!
Aquí está la solución para aquellos que estén interesados.
SELECT
`package`.*,
GROUP_CONCAT(`zones`.`zone` ORDER BY `zones`.`zone` ASC SEPARATOR ',' ) as `zone_list`
FROM
`package`,
`package_zones`
LEFT JOIN
(`zones`,`ao_package_zones`) ON (`zones`.`zone_id` = `package_zones`.`zone_id` AND `package_zones`.`package_id` = `package`.`package_id`)
GROUP BY
`ao_package`.`package_id`
Solución
utilizando el GROUP_CONCAT () función y una GROUP BY llamada. he aquí un ejemplo de consulta ??p>
SELECT
p.package_id,
p.package_name,
p.price,
GROUP_CONCAT(pz.zone_id SEPARATOR ',') as zone_list
FROM
package p
LEFT JOIN package_zone pz ON p.package_id = pz.package_id
GROUP BY
p.package_id
aún debe ser capaz de ordenar por IdDeZona s (o zone_list), y en lugar de utilizar LIKE
, puede utilizar WHERE zp.zone_id = 'Z1'
o algo similar.