如何在mysql中将子查询中的字符串连接到一行中?

o8x7eapl  于 2021-06-23  发布在  Mysql
关注(0)|答案(1)|浏览(371)

我有三张table:

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中使用表示层来获得所需的结果。问题是,我想能够排序区域\列表asc或desc,甚至使用“where zone \ u list like”等等。为了做到这一点,我需要在mysql中完成。
我甚至不知道该如何着手解决这个问题。我尝试使用子查询,但它一直抱怨有多行。我试图将多行合并成一个字符串,但显然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`
lo8azlld

lo8azlld1#

通过使用group\u 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

您仍然可以按区域id(或区域列表)订购,而不是使用 LIKE ,您可以使用 WHERE zp.zone_id = 'Z1' 或者类似的东西。

相关问题