[英]SQL query where combination of two columns is unique (with sub-query)
我有兩個桌子。 一個帶有聯系信息,另一個帶有組列表。 例如:
clients
+-------------+---------------+-------------+------------+
| client_id | client_name | group1_id | group2_id |
+-------------+---------------+-------------+------------+
| 283 | John Smith | 1 | null |
| 284 | Jane Smith | 1 | 2 |
| 285 | Tim Johnson | 1 | null |
| 286 | Peter Guy | null | null |
+-------------+---------------+-------------+------------+
groups
+------------+----------------+
| group_id | group_name |
+------------+----------------+
| 1 | Smith Group |
| 2 | Johnson Group |
+------------+----------------+
如果不言而喻,group1_id和group2_id是groups表中的外鍵。
我需要編寫查詢以選擇客戶端名稱和組名稱。 如果客戶端是兩個組的成員(例如Jane Smith),則它們應在輸出中出現兩次。 理想情況下,每行應輸出組名,然后在括號中輸出客戶名,並且所有結果應按字母順序排序。 因此,對於以上表,輸出應為:
John Smith (Jane Smith)
Johnson Group (Jane Smith)
Johnson Group (Tim Johnson)
Smith Group (John Smith)
是否可以使用單個SQL查詢?
我正在使用MySQL。 目前,我正處於項目的計划階段,因此,如果需要更改數據庫架構以更好地支持,則可以。
提前致謝。
是的,可以通過使用in
或or
進行join
。
select c.client_name, g.group_name
from clients c
join groups g on g.group_id in (c.group1_id, c.group2_id)
但是,我建議您研究database normalization
。 更改表結構以包含名為ClientGroup
的第三個表最好用作聯結表。 然后,您將得到如下結果:
clients (client_id, client_name)
groups (group_id, group_name)
clientgroup (client_id, group_id)
然后,你可以只join
表再次合作:
select c.client_name, g.group_name
from clients c
join clientgroup cg on c.client_id = cg.client_id
join groups g on cg.group_id = c.group_id
如果客戶端匹配兩次時希望兩行,請使用or
:
select c.client_name, g.group_name
from clients c join
groups g
on g.group_id = c.group1_id or g.group_id = c.group2_id;
這樣會將結果格式化為兩列,而不是將組名放在括號中的字符串。
謝謝sgeddes和Gordon的快速有用的回答。 我認為我需要一個連接,但是在正確使用語法時遇到了麻煩(我以前沒有使用過連接)。 在看到其他人給出答案之后,最終結果非常明顯!
括號中帶有排序和客戶名稱,最終查詢為:
SELECT client_id, CONCAT(g.group_name, " (", c.client_name, ")") new_col
FROM clients c
JOIN groups g on g.group_id IN (c.group1_id, c.group2_id)
ORDER BY g.group_id, c.client_name ASC
我是初次發布者,看不到授予答案的方法。 我是否缺少某些東西,還是僅是提供賞金的問題才可以獲獎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.