varias - ¿Cómo concateno cadenas de una subconsulta en una sola fila en mysql?
group_concat mysql (1)
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 trato de hacer es devolver toda la información en la tabla de paquetes MÁS una lista de zonas para ese paquete. Quiero que la lista de zonas esté ordenada alfabéticamente y separada por comas.
Entonces el resultado 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 que me gustaría poder ordenar zone_list ASC o DESC o incluso usar "WHERE zone_list LIKE", y así sucesivamente. Para hacer eso, necesito esto hecho en MYSQL.
No tengo ni idea de cómo empezar a abordar esto. Intenté usar una subconsulta, pero seguía quejándose de varias filas. Traté de combinar las múltiples filas en una sola cadena, pero evidentemente a MySQL no le gusta esto.
Gracias por adelantado.
¡ACTUALIZAR!
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`
mediante el uso de la función GROUP_CONCAT () y una llamada GROUP BY. aquí hay una consulta de ejemplo
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 debería poder ordenar por zone_id s (o zone_list), y en lugar de usar LIKE
, puede usar WHERE zp.zone_id = ''Z1''
o algo similar.