2011-03-05 56 views
1

我對SQL沒有太多的經驗,對於比簡單的INSERT/SELECT語句更高級的任何東西,我幾乎都失去了它。SQL,使用另一個表中的數據從另一個表中查詢數據

我的情況是這樣的,我有以下兩個表:

遊戲 { INT ID,詮釋完 }

提交 { INT game_id,詮釋USER_ID }

我想查詢完成的遊戲中的任何id = 0,並且在提交表中,特定的user_id不與綁定在一起的id綁定在一起。

換句話說,我想找到一個未完成的遊戲,並且某個特定的用戶沒有玩過。

我知道我可以用多個查詢和邏輯來做到這一點(在java和jdbc中,如果它很重要),但我寧願學習如何用純SQL來做到這一點!

謝謝!

+0

你有一個表,其中您存儲的所有用戶? – 2011-03-05 01:03:13

+0

您使用的是什麼RDBMS? – 2011-03-05 01:15:58

+0

是的。但我認爲這與問題無關,不是嗎? – monoceres 2011-03-05 01:17:35

回答

3
SELECT g.id 
FROM Games g 
WHERE finished = 0 
     AND NOT EXISTS(SELECT * 
         FROM Submissions s 
         WHERE s.user_id = @userid 
          AND s.game_id = g.id) 

或者(如果您的RDBMS支持的話)

SELECT id 
FROM Games 
WHERE finished = 0 
EXCEPT 
SELECT game_id 
FROM Submissions 
WHERE user_id = @userid 
+0

剛剛嘗試過第一個版本。像魅力一樣工作,並且因爲MySQL顯然不支持除了我正在使用它。謝謝。 – monoceres 2011-03-05 01:30:48

0
SELECT G.ID FROM Games G LEFT JOIN Submissions S ON 
(G.ID = S.Game_ID AND S.User_ID = @UserID) 
WHERE G.Finished = 0 AND S.User_ID IS NULL 

編輯但現在類似給他人。

+0

你是什麼意思<1?也許= 0,或者你認爲負值也會發生,誰在乎user_id是否<1?也許計數(s.user_id)= 0?。還有HAVING關鍵字不能被關鍵字使用。 – 2011-03-05 01:10:59

+0

此外'WHERE S.User_ID = @ UserID'會將你的'OUTER JOIN'轉換回'INNER JOIN' – 2011-03-05 01:15:07

2
SELECT g.id 
FROM Games g 
    LEFT JOIN Submissions s ON g.id = s.game_id 
     AND s.user_id = 1234 
WHERE g.finished = 0 AND s.user_id IS NULL 
+0

最不明朗的版本,你會忘記它做了什麼,再看一遍 – 2011-03-05 01:23:44

+0

@ valentin-kuzub它是標準的'NOT EXISTS LEFT JOIN',MySql優化了它,並且勝過了你提供的'NOT IN()'解決方案。 – 2011-03-05 05:28:23

2
select g.id from games g 
where finished =0 and g.id not in 
(select game_id from submissions s where [email protected]) 
+1

+1這就是現在做的反半聯接的四種方式,我想! – 2011-03-05 01:16:59

+0

我喜歡這個&減號/除了版本最多:P – 2011-03-05 01:19:53

相關問題