gpt4 book ai didi

php - MySQL 将多行查询合并为一列

转载 作者:行者123 更新时间:2023-11-29 01:57:58 24 4
gpt4 key购买 nike

表结构

client_commands(“主”表):
编号 |完成

命令国家:
编号 |命令编号 |国家代码

command_os:
编号 | command_id |操作系统

command_id on 引用 client_commands 的 id 列。

问题

我可以添加带有基于国家和操作系统过滤器的客户端命令。为了尝试规范化我的数据库结构,对于添加的每个新命令:

  • 向 client_commands 添加新行
  • 对于每个国家/地区,我向 command_countries 添加一个新行,每个引用 client_command.id
  • 对于每个操作系统,我向 command_os 添加一个新行,每个引用 client_command.id

对于我网站上的一个页面,我需要显示所有 client_commands(其中 completed = 0)以及该命令的所有国家和操作系统。我想要的输出是这样的:

id | countries | OS
1 | GB, US, FR| 2, 3
2 | ES, HU | 1, 3

我不确定该怎么做。我正在使用的当前查询返回多行:

SELECT a.id, b.country_code, c.OS
FROM client_commands a
LEFT JOIN command_countries b on b.command_id = a.id
LEFT JOIN command_os c on c.command_id = a.id
WHERE a.completed = 0

Query results

有什么帮助吗?

谢谢!

编辑:我忘了提及(如果您无法从上面推断)- 每个命令可以有不同数量的操作系统和国家/地区。

--

另外:我知道我可以通过提取所有命令,然后循环遍历并为每个结果运行 2 个额外的查询来做到这一点。但如果可以的话,我希望通过一个查询尽可能高效地完成。

最佳答案

您可以使用 GROUP_CONCAT 在一个查询中执行此操作

SELECT a.id, 
GROUP_CONCAT(DISTINCT b.country_code SEPARATOR ' ,') `countries`,
GROUP_CONCAT(DISTINCT c.OS SEPARATOR ' ,') `os`,
FROM client_commands a
LEFT JOIN command_countries b on b.command_id = a.id
LEFT JOIN command_os c on c.command_id = a.id
WHERE a.completed = 0
GROUP BY a.id

如果您想要连续排列结果,您可以在 GROUP_CONCAT 中使用 ORDER BY,例如

GROUP_CONCAT(b.country_code ORDER BY b.command_id DESC SEPARATOR ' ,') `countries`

但请注意,默认情况下它对 concat 设置了 1024 个字符的限制,但这可以增加 b,manual 中提供的步骤

关于php - MySQL 将多行查询合并为一列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23035065/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com