如何将子查询中的字符串连接到mysql中的一行?
Posted
技术标签:
【中文标题】如何将子查询中的字符串连接到mysql中的一行?【英文标题】:How do I concatenate strings from a subquery into a single row in mysql? 【发布时间】:2011-04-25 13:00:52 【问题描述】:我有三张桌子:
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 中使用表示层做一些事情来获得所需的结果。问题是,我希望能够对 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 by 和 group_concat 我用你的问题更新了部分选择角色。*,GROUP_CONCAT(rp.permission_id SEPARATOR ',') as permission_ids from roles join role_permissions rp on roles.id = rp.role_id GROUP BY roles.id。作品 【参考方案1】:通过使用 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)进行排序,并且可以使用 LIKE
或类似的东西来代替 LIKE
。
【讨论】:
如此接近。差不多了!我希望 zone_list 按字母顺序排序。这就是为什么我更多地考虑子查询。不过非常接近。 发现我可以在 GROUP CONCAT 中输入“ORDER BY”。所以 GROUP_CONCAT(pz.zone_id ORDER BY pz.zone_id ASC SEPARATOR ',') 工作!!!! 修订:没用。它总是为每一行返回所有可能的区域。每行应该只返回该特定包的区域。 我想出了如何防止所有可能的行返回。你必须做一个交叉连接。我会把答案放在问题中让所有人看到。 对于任何想在 SQL Server 中执行此操作的人:***.com/questions/6899/…以上是关于如何将子查询中的字符串连接到mysql中的一行?的主要内容,如果未能解决你的问题,请参考以下文章