2012-08-08 79 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