2013-06-05 51 views
0

我一直在努力解決以下問題。MySQL查詢表過濾問題

我有3個表格:players,players_clothes和teams_clothes。

players

id user team_id 
1 tom 4 
2 robo 5 
3 bob 4

所以湯姆和鮑勃都在同一支球隊

players_clothes

id  clothes_id  p_id 
1  13    1 
2  35    3 
3  45    3

Bob擁有的衣服用品35和45,ROBO現在沒有。

teams_clothes

id clothes_id  team_id 
1  35    4 
2  45    4 
3  55    4 
4  65    5

這說明哪支球隊有哪些服裝製品的權利。問題是:湯姆穿着一件不屬於他的團隊的衣服......讓我們假設這是非法的。

我很難找出如何捕捉所有爲特定團隊穿着非法服裝的人。

SELECT pc.clothes_id FROM players AS p 
JOIN players_clothes AS pc 
ON p.id = pc.p_id 
AND p.team_id = 4 GROUP BY pc.clothes_id 

(由players_clothes.clothes_id予組中,因爲相信與否,兩個玩家可以被分配相同的一件衣服)

我認爲這導致了以下一組(13,35,45)

現在我想檢查一下隊伍4所擁有的實際套裝。

SELECT clothes_id FROM teams_clothes WHERE team_id = 4 and this return (35, 45, 55) 

如何創建一個查詢以便返回(13)?我試過的東西如不存在,但我認爲在GROUP BY players_clothes.clothes_id部分礙事

+0

提供有意義的名稱,以表和別名,甚至[更多]例如的緣故。 – moonwave99

+1

謝謝,照顧它 – Tyrick

回答

2

我建議

select * from A where team_id = $team_id join B on B.a_id = A.id 
where not exists 
(
    select 1 from C where C.clothes_id = B.clothes_id and team_id = $team_id 
) 

基本上,我們發現所有至於誰是自己的球隊和每個加入他們所穿的所有衣服,然後只返回行,如果我們在表C中找不到指示,表示衣服在我們的團隊中(這涵蓋C中不存在並且存在但存在於C上的錯誤團隊中)

2

這應該是絕招:

SELECT b.a_id, b.clothes_id 
FROM 
    b INNER JOIN a 
    ON b.a_id = a.id 
    LEFT OUTER JOIN c 
    ON a.team_id = c.team_id 
WHERE 
    c.clothes_id = NULL 

我們的想法是對錶A/B的組合進行外部連接,然後僅查找c.clothes_id爲NULL的情況,這將表示那些沒有關係匹配的情況外連接(即衣服物品未被該用戶團隊批准)。

1

不知道這是你太晚了,但我會改變數據庫模型本身,使這種情況不可能在首位:

enter image description here省略

(「不重要」的領域簡潔,包括代理鍵,如PLAYER_ID。)

注TEAM_ID如何遷移通過從TEAM到播放器中的識別關係,然後向PLAYER_ARTICLE,在那裏它合併具有相同的字段通過TEAM_ARTICLE遷移。由於PLAYER_ARTICLE表中只有一個物理TEAM_ID字段,因此永遠不能插入可引用不同團隊的行。

用更抽象的術語來說:這是一個菱形依賴關係,其中TEAM位於頂部,PLAYER_ARTICLE位於鑽石底部。底部合併(通過使用識別關係啓用)確保雙方必須始終指向同一頂部。


你的榜樣數據將被這樣表示...

PLAYER:

TEAM_ID PLAYER_NO 
4  1   -- Tom 
5  1   -- Robo 
4  2   -- Bob 

TEAM_ATRICLE:

TEAM_ID ARTICLE_ID 
4  35 
4  45 
4  55 
5  65 

PLAYER_A RTICLE:

TEAM_ID PLAYER_NO ATRICLE_ID 
4  1   13   -- Tom: this is impossible (FK violation). 
4  2   35   -- Bob 
4  2   45   -- Bob