簡體   English   中英

MySQL將多行查詢連接到一列

[英]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添加新行
  • 對於每個國家/地區,我都會在command_countries中添加新行,每個行都引用client_command.id
  • 對於每個操作系統,我向command_os添加新行,每個行都引用client_command.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM