2010-10-14 12 views
32

Tengo tres tablas:¿Cómo concateno cadenas de una subconsulta en una sola fila en mysql?

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 devolver toda la información en la tabla paquete más una lista de las zonas correspondientes a ese paquete. Quiero que la lista de zonas esté ordenada alfabéticamente y separada por comas.

lo 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 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 hacer frente a 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 de antemano.

¡ACTUALIZACIÓN!

Aquí está la solución para quienes 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` 
+0

use group by con group_concat en el campo de zona –

Respuesta

51

utilizando la función GROUP_CONCAT() y una llamada GROUP BY. 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.

+0

Tan cerca. ¡Casi allí! Me gustaría que zone_list se ordene alfabéticamente. Es por eso que estaba pensando más en la línea de una subconsulta. Muy cerca sin embargo. – mrbinky3000

+1

Encontré que podía poner "ORDER BY" en GROUP CONCAT. entonces GROUP_CONCAT (pz.zone_id ORDER BY pz.zone_id ASC SEPARATOR ',') funcionó !!!! – mrbinky3000

+0

Revisión: no funcionó. Siempre devuelve todas las zonas posibles para cada fila. Cada fila solo debe devolver las zonas para ese paquete específico. – mrbinky3000

Cuestiones relacionadas