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`
¿Fue útil?

Solución

utilizando el GROUP_CONCAT () función y una GROUP BY llamada. he aquí un ejemplo de consulta

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top