怎么将子查询中的字符串连接到mysql中的一行?

本教程将介绍如何将子查询中的字符串连接到mysql中的一行?的处理方法,这篇教程是从别的地方看到的,然后加了一些国外程序员的疑问与解答,希望能对你有所帮助,好了,下面开始学习吧。

怎么将子查询中的字符串连接到mysql中的一行? 教程 第1张

问题描述

我有三张桌子:

table "package"
-----------------------------------------------------
package_idint(10)  primary key, auto-increment
package_name varchar(255)
price  decimal(10,2)

table "zones"
------------------------------------------------------
zone_idvarchar(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 中完成.

我什至不知道怎么开始解决这个问题.我尝试使用子查询,但它一直抱怨多行.我试图将多行连接成一个字符串,但显然 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 (或 zone_list)进行排序,并且可以使用 WHERE zp.zone_id = 'Z1' 来代替 LIKE 或类似的东西.

好了关于怎么将子查询中的字符串连接到mysql中的一行?的教程就到这里就结束了,希望趣模板源码网找到的这篇技术文章能帮助到大家,更多技术教程可以在站内搜索。