web-dev-qa-db-ja.com

サブクエリの文字列をmysqlの単一の行に連結するにはどうすればよいですか?

3つのテーブルがあります。

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)

私がやろうとしているのは、パッケージテーブルのすべての情報とそのパッケージのゾーンのリストを返すことです。アルファベット順に並べられ、コンマで区切られたゾーンのリストが必要です。

だから私が探している出力はこのようなものです...

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

PHPでプレゼンテーション層を使用して目的の結果を得ることができることを知っています。問題は、zone_list ASCまたはDESCをソートしたり、WHERE zone_list LIKEを使用したいことです。 「など。これを行うには、MYSQLでこれを行う必要があります。

どうやってこれに取り組むことを始めるのか、私には分かりません。サブクエリを使用しようとしましたが、複数の行について文句を言い続けました。複数の行を1つの文字列に連結しようとしましたが、MySQLはこれを好まないようです。

前もって感謝します。

更新!

興味のある方のためのソリューションをご紹介します。

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`
34
mrbinky3000

GROUP_CONCAT() 関数とGROUP BY呼び出しを使用します。ここにクエリの例があります

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

zone_id s(またはzone_list)で並べ替えることができます。LIKEを使用する代わりに、WHERE zp.zone_id = 'Z1'または同様のもの。

57
GSto