如何将子查询中的字符串连接到mysql中的单行中? [英] How do I concatenate strings from a subquery into a single row in mysql?
问题描述
我有三个表:
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)
我想做的是返回包裹表中的所有信息,以及该包裹的区域列表.我想要按字母顺序排序并以逗号分隔的区域列表.
What I'm trying to do is return all the information in package table PLUS a list of zones for that package. I want the list of zones sorted alphabetically and comma separated.
所以我正在寻找的输出是这样的...
So the output I'm looking for is something like this...
+------------+---------------+--------+----------------+
| 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中完成.
I know I could do something in PHP with the presentation layer to get the desired result. The problem is, I would like to be able to sort zone_list ASC or DESC or even use" WHERE zone_list LIKE" and so on. In order to do that, I need this done in MYSQL.
我什至不知道如何开始解决这个问题.我尝试使用子查询,但是它不断抱怨多个行.我试图将多行合并为一个字符串,但是显然MySQL不喜欢这样.
I have NO idea how to even begin to tackle this. I tried using a subquery, but it kept complaining about multiple rows. I tried to concat the multiple rows into a single string, but evidently MySQL doesn't like this.
谢谢.
更新!
这是对感兴趣的人的解决方案.
Here is the solution for those who are interested.
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`
推荐答案
by using the GROUP_CONCAT() function and a GROUP BY call. here's an example query
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(或zone_list)进行订购,而不是使用LIKE
,您可以使用WHERE zp.zone_id = 'Z1'
或类似的东西.
you should still be able to order by zone_id s (or zone_list), and instead of using LIKE
, you can use WHERE zp.zone_id = 'Z1'
or something similar.
这篇关于如何将子查询中的字符串连接到mysql中的单行中?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!