47 Stimmen

Wie verkette ich Zeichenfolgen aus einer Unterabfrage in eine einzelne Zeile in mysql?

Ich habe drei Tabellen:

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 zu tun versuche, ist die Rückgabe aller Informationen in der Pakettabelle PLUS eine Liste der Zonen für dieses Paket. Ich möchte, dass die Liste der Zonen alphabetisch sortiert und durch Kommata getrennt ist.

Die Ausgabe, nach der ich suche, sieht also etwa so aus...

+------------+---------------+--------+----------------+
| 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 in PHP etwas mit der Präsentationsebene machen könnte, um das gewünschte Ergebnis zu erzielen. Das Problem ist, ich möchte in der Lage sein, zone_list ASC oder DESC zu sortieren oder sogar" WHERE zone_list LIKE" und so weiter zu verwenden. Um das zu tun, muss ich dies in MYSQL tun.

Ich habe keine Ahnung, wie ich das überhaupt angehen soll. Ich habe versucht, eine Unterabfrage zu verwenden, aber sie beschwert sich ständig über mehrere Zeilen. Ich habe versucht, die mehreren Zeilen in eine einzige Zeichenkette zu konkaten, aber offensichtlich mag MySQL das nicht.

Vielen Dank im Voraus.

UPDATE!

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

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`

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X