2010-10-14 5 views
32

J'ai trois tables:Comment concaténer des chaînes d'une sous-requête en une seule ligne dans 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) 

Ce que je suis en train de faire est de retourner toutes les informations dans le tableau paquet PLUS une liste de zones pour ce paquet. Je veux que la liste des zones soit triée par ordre alphabétique et séparée par des virgules.

donc la sortie que je suis à la recherche est quelque chose comme ça ...

+------------+---------------+--------+----------------+ 
| 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 | 
+------------+---------------+--------+----------------+ 

Je sais que je pourrais faire quelque chose en PHP avec la couche de présentation pour obtenir le résultat souhaité. Le problème est, je voudrais pouvoir trier zone_list ASC ou DESC ou même utiliser "WHERE zone_list LIKE" et ainsi de suite. Pour ce faire, j'ai besoin de cela fait dans MYSQL.

Je n'ai aucune idée de comment commencer à s'attaquer à cela. J'ai essayé d'utiliser une sous-requête, mais elle ne cessait de se plaindre de plusieurs lignes. J'ai essayé de concaténer les multiples lignes en une seule chaîne, mais évidemment, MySQL n'aime pas ça.

Merci d'avance.

MISE À JOUR!

Voici la solution pour ceux qui sont intéressés.

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 avec group_concat sur le champ de zone –

Répondre

51

en utilisant la fonction GROUP_CONCAT() et un appel GROUP BY. voici un exemple requête

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 

vous devriez toujours pouvoir commander par zone_id s (ou zone_list), et au lieu d'utiliser LIKE, vous pouvez utiliser WHERE zp.zone_id = 'Z1' ou quelque chose de similaire.

+0

Si proche. Presque là! J'aimerais que la zone_list soit triée par ordre alphabétique. C'est pourquoi je pensais plutôt à la sous-requête. Très proche cependant. – mrbinky3000

+1

J'ai trouvé que je pouvais mettre "ORDER BY" dans le groupe CONCAT. donc GROUP_CONCAT (pz.zone_id ORDRE PAR pz.zone_id ASC SEPARATOR ',') a fonctionné !!!! – mrbinky3000

+0

Révision: n'a pas fonctionné. Il retourne toujours toutes les zones possibles pour chaque ligne. Chaque ligne doit uniquement renvoyer les zones pour ce package spécifique. – mrbinky3000

Questions connexes