簡體   English   中英

兩列組合唯一的SQL查詢(帶有子查詢)

[英]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。 目前,我正處於項目的計划階段,因此,如果需要更改數據庫架構以更好地支持,則可以。

提前致謝。

是的,可以通過使用inor進行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.

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