mrb*_*000 34 mysql concat list subquery group-concat
我有三张桌子:
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)
Run Code Online (Sandbox Code Playgroud)
我要做的是返回包表中的所有信息PLUS该包的区域列表.我希望区域列表按字母顺序排序并以逗号分隔.
所以我正在寻找的输出是这样的......
+------------+---------------+--------+----------------+
| 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 |
+------------+---------------+--------+----------------+
Run Code Online (Sandbox Code Playgroud)
我知道我可以在PHP中使用表示层来完成所需的结果.问题是,我希望能够对zone_list ASC或DESC进行排序,甚至使用"WHERE zone_list LIKE"等等.为了做到这一点,我需要在MYSQL中完成.
我不知道如何开始解决这个问题.我尝试使用子查询,但它一直抱怨多行.我试图将多行连接成一个字符串,但显然MySQL并不喜欢这样.
提前致谢.
UPDATE!
这是有兴趣的人的解决方案.
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`
Run Code Online (Sandbox Code Playgroud)
GSt*_*Sto 58
通过使用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
Run Code Online (Sandbox Code Playgroud)
你仍然可以通过zone_id s(或zone_list)订购,而不是使用LIKE,你可以使用WHERE zp.zone_id = 'Z1'或类似的东西.
| 归档时间: |
|
| 查看次数: |
47741 次 |
| 最近记录: |