2011-03-05 75 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

相关问题