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`
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'
または同様のもの。