2010-10-14 6 views
32

Ich habe drei Tabellen:Wie verkette ich Zeichenfolgen aus einer Unterabfrage in eine einzelne Zeile in 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) 

Was ich versuche, für das Paket alle Daten in Paket Tabelle PLUS eine Liste von Zonen zu tun zurückzukehren. Ich möchte die Liste der Zonen alphabetisch sortiert und durch Komma getrennt erhalten.

So ist die Ausgabe, die ich suche ist so etwas wie dieses ...

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

Ich weiß, dass ich etwas in PHP mit der Präsentationsschicht tun konnte das gewünschte Ergebnis zu erhalten. Das Problem ist, ich würde in der Lage sein, zone_list ASC oder DESC oder sogar "WHERE zone_list LIKE" usw. zu sortieren. Um das zu tun, brauche ich das in MYSQL.

Ich habe keine Ahnung, wie man überhaupt damit anfängt. Ich habe versucht, eine Unterabfrage zu verwenden, aber sie beschwerte sich über mehrere Zeilen. Ich habe versucht, die mehreren Zeilen zu einer einzigen Zeichenfolge zu verbinden, aber offensichtlich mag MySQL das nicht.

Vielen Dank im Voraus.

UPDATE!

Hier ist die Lösung für diejenigen, die interessiert sind.

+0

Verwenden Sie die Gruppe von mit mit group_concat auf Zone Feld –

Antwort

51

mit der Funktion GROUP_CONCAT() und einem GROUP BY-Aufruf. hier ist ein Beispiel Abfrage

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 

Sie noch in der Lage sein sollten, durch zone_id s (oder zone_list), um zu bestellen und stattdessen LIKE zu verwenden, können Sie WHERE zp.zone_id = 'Z1' oder etwas ähnliches verwenden.

+0

So nah. Fast dort! Ich möchte, dass zone_list alphabetisch sortiert wird. Deshalb dachte ich eher an eine Unterabfrage. Sehr nah aber. – mrbinky3000

+1

Konnte ich "ORDER BY" in GROUP CONCAT setzen. So hat GROUP_CONCAT (pz.zone_id ORDER BY pz.zone_id ASC SEPARATOR ',') gearbeitet !!!! – mrbinky3000

+0

Revision: hat nicht funktioniert. Es gibt immer alle möglichen Zonen für jede Zeile zurück. Jede Zeile sollte nur die Zonen für dieses bestimmte Paket zurückgeben. – mrbinky3000

Verwandte Themen