【问题标题】:SQL Query in Historytable Status历史表状态下的 SQL 查询
【发布时间】:2012-08-05 15:03:49
【问题描述】:

我有一个关于 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 行适合此语句。我认为解决方案很简单,但我现在无法得到-.-

提前致谢

【问题讨论】:

  • @Yuck Article1 确实有status_id = 2 - 这是表格中的第一行:)

标签: sql logic operator-keyword


【解决方案1】:

您需要使用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

【讨论】:

  • 这就是答案,很好!但是“IN”运算符会导致性能下降。有什么不同的想法吗?
  • @alabama 我现在提出了 3 种不同的方法 - 您需要测试哪种方法最适合您的场景,因为不同的 DBMS 的行为都会有所不同。
  • 感谢您的解决方案,效果很好。 join 方法是 MySQL 数据库上最快的。
  • +1 - 不过,如果NOT EXISTS() 版本的子查询是相关的呢?
猜你喜欢
  • 1970-01-01
  • 2019-01-27
  • 1970-01-01
  • 2013-01-27
  • 1970-01-01
  • 1970-01-01
  • 2013-01-25
  • 2012-10-16
  • 1970-01-01
相关资源
最近更新 更多