2012-02-13 6 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 

これは私のテーブルの外観です。 nat_caps = "0"のnat_caps!= "0"を持つすべてのnatまたはplayer_idに対してnat_caps = "68"のplayer_idを選択します。他の行の類似または反対のデータに基づいて1つの行を選択するにはどうすればよいですか?

私が使用しようとするSQLクエリは次のとおりです。

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

しかし、彼らの両方がクエリに一致するが、私はそれらをのでしたくない1つのエントリを持っているので、私はplayer_id「42904」と「28664」を取得彼らはnat "68"よりも別のnatのためにnt_capsを持っています。

私が達成しようとしていることを理解していただければ幸いです。

+4

あなたはこのORことをしたい場合は、なぜあなたが使用していますか? –

+0

私には混乱するように聞こえます。しかし、私は理解しているように、最初のANDをORに変更すると、クエリはOKに戻ります。 – itachi

+0

'nt_caps'にNULL値がありますか? –

答えて

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

あなたはその質問を誤解しました。彼はすべてのナットのために0を持つことを望んでいる(同じプレーヤーのために複数のレコードがある) –

+0

問題は、nt_caps = 0でもナット!= 68を持っているものより多くのレコードを持っていることで、私はそれらを(私はそのクエリでそれらを得る)したくない。 – user1207764

+0

なぜGROUP BY player_idを追加しないのですか? – powtac

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

良いコメント。それが私がそれをした方法です。それは素敵でシンプルで繰り返しはありません。 –

関連する問題