2012-08-08 118 views
2

我對sql查詢有一個簡單的邏輯問題。歷史表狀態中的SQL查詢

有一些文章的歷史記錄表和文章與status_id有一排。一篇文章可以具有各種各樣的地位,我只想得到這些文章,從來沒有給定的地位。例如:

articlename | status_id 
article1 | 2 
article1 | 1 
article1 | 3 
article2 | 2 
article2 | 3 
article3 | 2 
article3 | 3 


SELECT * FROM article WHERE article.status_id != 2 GROUP BY article.id 

這只是錯誤的代碼,我得到「article1」,因爲它有2行適合此聲明。我認爲解決的辦法很簡單,但我不能在此刻得到提前

+0

@Yuck第一條** **確實有'STATUS_ID = 2' - 它在表的第一行:) – 2012-08-08 13:33:45

回答

2

-.-

感謝您需要使用NOT IN刪除所有有過的「2」狀態的文章。

/* NOT IN BASED APPROACH */ 
SELECT * 
FROM article 
WHERE article.id NOT IN (
    SELECT article.id 
    FROM article 
    WHERE article.status_id = 2) 

/* NOT EXISTS BASED APPROACH */ 
SELECT * 
FROM article 
WHERE article.id NOT EXISTS (
    SELECT * 
    FROM article 
    WHERE article.status_id = 2) 

/* JOIN BASED APPROACH */ 
SELECT * 
FROM article a1 LEFT JOIN 
     article a2 
     ON a1.id = a2.id 
     AND a2.status_id = 2 
WHERE a2.id IS NULL 
+0

這就是答案,真好!但「IN」操作符會導致性能下降。任何不同的想法? – alabama 2012-08-08 13:40:43

+0

@alabama我已經提出了3種不同的方法 - 您需要測試哪種方法對您的方案最快,因爲不同的DBMS的行爲會有所不同。 – 2012-08-08 13:49:00

+0

感謝您的解決方案,它的工作相當不錯。連接方法是MySQL數據庫上最快的。 – alabama 2012-08-08 14:21:19