2011-12-13 23 views
0

返回只有符合特定條件的

ID Rank 

11 1 
11 2 
22 1 
22 2 
22 3 
33 1 
33 3 
44 1 
55 1 
55 2 

我想

11 
44 
55 

也就是說,我想只返回沒來過的「3等級的ID值」。

更新 - 我想到了另一種方法,相當簡單,除了下面的答案外,還可以做到這一點。

SELECT ID FROM 
( 
    SELECT ID, SUM(CASE WHEN Rank = 3 THEN 1 ELSE 0 END) flag FROM 
    ( 
    SELECT ID, Rank FROM T1 
) a 
    GROUP BY ID  
) b 
WHERE flag = 0; 
+0

有幾件事,請看下面。 –

+0

下面?在哪裏?把它們放在你的_question_中。 –

+0

@ TomalakGeret'kal我在下面發佈了另一個答案。 –

回答

2

使用NOT EXISTS

SELECT DISTINCT 
    yt1.ID 
FROM 
    yourTable yt1 
WHERE 
    NOT EXISTS (
     SELECT * 
     FROM yourTable yt2 
     WHERE 
      yt1.ID = yt2.ID 
      AND yt2.Rank = 3 
    ) 

或者,使用LEFT JOIN

SELECT DISTINCT 
    yt1.ID 
FROM 
    yourTable yt1 
    LEFT JOIN yourTable yt2 ON yt1.ID = yt2.ID AND yt2.Rank = 3 
WHERE 
    yt2.ID IS NULL 
+0

gud way但不需要你可以很簡單的方式做到這一點 –

+0

@Michael'NOT EXISTS'和'LEFT JOIN'都按預期工作。謝謝。 –

+0

@邁克爾看看我的答案。 –

-1
select ID as IDS from table where rank != 3 group by table.ID; 
+1

29回答後,請閱讀格式化常見問題解答。 –

+0

這仍然會返回每個ID,只是沒有特定的行,其中ID的排名爲3 ... –

+0

什麼問題? –

0

我會做的唯一ID的數組,然後檢查那些爲三個等級。那些沒有,把他們放入最後陣列。

$idArray = array(); 
$noThreeArray = array(); 

$query = 'SELECT DISTINCT ID FROM yourTable'; 
while($row = mysql_fetch_array($query)){ 
    $idArray[] = $row['ID']; 
} 
foreach($idArray as $id){ 
    $query = 'SELECT ID FROM yourTable WHERE ID = $id AND Rank = 3'; 
    if(mysql_num_rows($query) == 0){ 
     $noThreeArray[] = $row['ID']; 
    } 
} 

$ noThreeArray現在具有您之後的值。

+0

確定這有效。但現在,我要堅持一個快速的SQL解決方案。 –

0
SELECT ID FROM 
( 
    SELECT ID, SUM(CASE WHEN Rank = 3 THEN 1 ELSE 0 END) flag FROM 
    ( 
    SELECT ID, Rank FROM T1 
) a 
    GROUP BY ID  
) b 
WHERE flag = 0; 
相關問題