0

基本上我有两张桌子

articleID 
  1
  2
  3
  4


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

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

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!

但我想避免嵌套查询,因为这个查询很慢。有什么提示吗?

4

3 回答 3

1

使用外连接

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 版本,更重要的是表大小和统计信息。

于 2013-02-19T22:57:53.497 回答
1

你可以做

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

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

于 2013-02-19T22:58:13.263 回答
0

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

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

或者你可以把它加入你的article桌子。

于 2013-02-19T23:11:04.060 回答