2012-02-13 62 views
4
id player_id nat nt_caps 
13740 28664 97 24 
13741 28664 68 0 
13742 28664 79 0 
16252 42904 15 40 
16253 42904 68 0 
16254 42904 241 0 

這就是我的表的外觀。我想選擇只有nt_caps =「0」的nat OR player_id只有nat =「68」的nt_caps!=「0」的player_id。如何根據其他行中的相似或反向數據選擇一行?

的SQL查詢我試着使用方法是:

SELECT player_id FROM x WHERE nat = '68' AND (nat != '68' AND nt_caps = '0') 

但後來我得到player_id「42904」和「28664」,因爲它們都具有與查詢匹配1個條目,但我不想讓他們因爲他們擁有另一個nat而不是nat「68」的nt_caps。

我希望你明白我想要達到的目標。

+4

如果你要這要那,你爲什麼使用AND? – 2012-02-13 21:18:03

+0

對我來說聽起來很混亂。但仍然如我所知,將第一個AND更改爲OR,並且您的查詢應該返回正常。 – itachi 2012-02-13 21:23:10

+0

'nt_caps'中是否有NULL值? – 2012-02-13 21:24:31

回答

2
SELECT * FROM x WHERE nt_caps = 0 OR (nt_caps != 0 AND nat = 68) 
+0

你誤解了這個問題。他希望玩家對所有的nats都有0(同一玩家有多個記錄) – 2012-02-13 21:21:34

+0

問題是我有更多的記錄比那些有nt_caps = 0的記錄更多,但是他們的nat!= 68然後我不'不想要他們(我用他們的問題得到他們)。 – user1207764 2012-02-13 21:23:55

+0

那你爲什麼不添加'GROUP BY player_id'? – powtac 2012-02-13 22:45:02

1

第一子查詢得到所有nt_caps等於0行,第二子查詢返回的其它行:

(SELECT x1.player_id 
FROM x x1 
LEFT JOIN x x2 
    ON x2.player_id = x1.player_id 
    AND x2.nt_caps <> 0 
WHERE x1.nt_caps = 0 
    AND x2.id IS NULL) 
UNION 
(SELECT x1.player_id 
FROM x x1 
LEFT JOIN x x2 
    ON x2.player_id = x1.player_id 
    AND x2.nt_caps <> 0 
    AND x2.nat <> x1.nat 
WHERE x1.nat = 68 
    AND x1.nt_caps <> 0 // Exclude this line if nt_caps "can be" !=0 instead of "must be" 
    AND x2.id IS NULL) 
+1

好評。我就是這麼做的。保持它很好,簡單,沒有迭代。 – 2012-02-13 22:14:00