[英]MySQL join multiple rows of query into one column
client_commands (“主”表):
id | completed
command_countries :
id | command_id | country_code
command_os :
id | command_id |OS
on的command_id引用client_commands的id列。
我可以添加带有基于国家和操作系统的过滤器的客户端命令。 要尝试规范我的数据库结构,请为每个添加的新命令:
对于我网站上的页面之一,我需要显示所有client_commands(已完成= 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
有什么帮助吗?
谢谢!
编辑:我忘了提(如果您不能从上面推断)-每个命令可以有不同数量的操作系统和国家/地区。
-
另外:我知道我可以通过拉出所有命令,然后遍历并为每个结果运行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, 手册中提供的步骤
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.