如何将子查询中的字符串连接到 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)
我想要做的是返回包表中的所有信息以及该包的区域列表。我想要按字母顺序排序并以逗号分隔的区域列表。
所以我正在寻找的输出是这样的:
+------------+---------------+--------+----------------+
| 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`
I have three tables:
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 |
+------------+---------------+--------+----------------+
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.
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.
Thanks in advance.
UPDATE!
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`
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
通过使用 GROUP_CONCAT() 函数和 GROUP BY 调用。这是一个示例查询,
您应该仍然可以按 zone_id (或 zone_list)进行排序,并且可以使用
WHERE zp.zone_id = 'Z1'
而不是使用LIKE
或类似的东西。by using the GROUP_CONCAT() function and a GROUP BY call. here's an example query
you should still be able to order by zone_id s (or zone_list), and instead of using
LIKE
, you can useWHERE zp.zone_id = 'Z1'
or something similar.我有一位客户要求我生成一个查询,以便在 prestashop 数据库中使用,以从 ps_orders、ps_customer 表中获取去年的记录;其中一列是 ps_order_detail 表中的“订单中的产品 ID 列表”。所以,我的查询结果是:
结果:
I have a customer who requested me to generate a query to use in a prestashop database to get the last year records from ps_orders, ps_customer tables; and one of those column was "The list of product ids in the order" from the ps_order_detail table. So, my query result was:
Result: