我有三个表:
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 table)中所有信息以及该包的区域列表。 我希望区域列表按字母顺序排序并用逗号分隔。
所以我期望得到的输出应该类似于这样:
+------------+---------------+--------+----------------+
| 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中完成。
我甚至不知道该如何开始解决这个问题。我尝试使用子查询,但它一直抱怨有多行。我尝试将多行concat
成一个字符串,但显然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`