选择没有任何相关记录的记录

时间:2013-02-19 22:54:54

标签: mysql sql

基本上我有两张桌子

articleID 
  1
  2
  3
  4


relatedType | articleID
     3              1
     4              1
     3              2
     4              3
     5              3
     2              4

我需要选择与type > 3没有任何相关记录的articleID。有了这个数据集,我基本上需要:

articleID
2
4

因为他们的相关类型只包含3和2。

我决定使用此查询:

SELECT * FROM article 
   WHERE articleID NOT IN (SELECT articleID FROM relatedTable 
                     ^         WHERE type > 3 GROUP BY portalid ) 
                     |
                     |--- NOT IN does the trick!

但是我想避免嵌套查询,因为这个查询非常慢。任何提示?

3 个答案:

答案 0 :(得分:1)

使用OUTER JOIN

SELECT a.articleID 
FROM article a LEFT OUTER JOIN relatedTable r
 ON (a.articleID = r.articleID and r.relatedType > 3)
WHERE r.articleID IS NULL

校正: 对不起,我刚才意识到请求不是列出那些具有类型>的任何记录的行。 3.您仍然可以通过在JOIN中创建子查询或创建临时表,为其编制索引然后加入它来实现。这些中的任何一个实际上是否比NOT IN子查询更快将取决于MySQL版本,更重要的是表格大小和统计数据。

答案 1 :(得分:1)

你可以做到

SELECT * FROM article a
 WHERE NOT EXISTS 
 (SELECT NULL FROM relatedTable b WHERE b.type > 3
  AND b.articleID = a.articleID)     

从技术上讲,实现所需结果的所有3种方法(NOT INNOT EXISTSLEFT JOIN)应该表现相同(对于非可空列)并且通常会生成相同的执行计划除了不建议使用NOT IN的mysql(或者在5.5之前不推荐,可能会更改) 我也会在原始查询中将GROUP BY归咎于性能不佳......

答案 2 :(得分:0)

如果您只需要文章ID,请尝试以下方法:

SELECT 
   articleID
FROM relatedTable
GROUP BY articleID
HAVING MAX(relatedType) <= 3

或者您可以将此加入article表格。