2012-05-30 28 views
1

我不確定如何說出該問題,但它更容易解釋。SQL - 如果其中一個ID具有某個列值,則選擇所有匹配的ID

如果我有一個表,看起來像這樣:

 
+-------+----------+-------+ 
| User | Result | Level | 
+-------+----------+-------+ 
| 1 | Victory |  1 | 
| 1 | Victory |  2 | 
| 1 | Victory |  3 | 
| 2 | Victory |  1 | 
| 2 | Defeat |  2 | 
| 3 | Defeat |  1 | 
| 4 | Defeat |  1 | 
| 5 | Defeat |  1 | 
+-------+----------+-------+ 

我希望能夠只選擇「用戶即有3級的勝利所以選擇將返回:

 
+-------+----------+-------+ 
| User | Result | Level | 
+-------+----------+-------+ 
| 1 | Victory |  1 | 
| 1 | Victory |  2 | 
| 1 | Victory |  3 | 
+-------+----------+-------+ 

其他人不會因爲他們沒有完成3級而退回。

非常感謝!我希望我解釋清楚。

回答

5

如果你只是想知道哪些用戶有3級的勝利:

SELECT User FROM my_table WHERE Result = 'Victory' AND Level = 3 

但是,如果(因爲你已經證明),你希望所有這些用戶的結果(與感謝@Andomar和@ConradFrix下面的註釋):

SELECT DISTINCT m1.* 
FROM my_table AS m1 
    JOIN my_table AS m2 USING (User) 
WHERE m2.Result = 'Victory' 
    AND m2.Level = 3 
+0

見m [sqlfiddle](http://sqlfiddle.com/#!2/dc5bb/1)。 – eggyal

+0

會工作但返回重複行,如果一個用戶在3級上有多個勝利,在10K代表+1 +1 gratz :) – Andomar

+0

@Andomar:好點!謝謝你,但我不在那裏*尚未* ... – eggyal

3

你可以使用一個exists條款,例如:

select * 
from scores s 
where exists 
     (
     select * 
     from scores vl3 
     where vl3.user = s.user 
       and vl3.Result = 'Victory' 
       and vl3.Level >= 3 
     ) 
+0

我認爲你獲得一個性能,如果你做Select * from table where exists( SELECT 1 FROM表其中X = Y)。 – vaquito

+0

@vaquito:[MySQL在這樣的子查詢中忽略SELECT列表,所以它沒有區別](https://dev.mysql.com/doc/en/exists-and-not-exists-subqueries.html)。 – eggyal

相關問題