Возврат только тех значений, которые соответствуют определенным критериям - PullRequest
0 голосов
/ 13 декабря 2011

У меня есть

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'.

ОБНОВЛЕНИЕ - я придумал другой способ, более простой, сделать это в дополнение к ответу ниже.

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;  

Ответы [ 4 ]

2 голосов
/ 13 декабря 2011

Использование 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 голосов
/ 28 декабря 2011
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 голосов
/ 13 декабря 2011

Я бы сделал массив уникальных идентификаторов, а затем проверил бы их на ранг три. Те, которые этого не делают, помещают их в окончательный массив.

$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 голосов
/ 13 декабря 2011
select ID as IDS from table where rank != 3 group by table.ID;
...