基本上我有两张桌子
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!
但是我想避免嵌套查询,因为这个查询非常慢。任何提示?
答案 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 IN
,NOT EXISTS
,LEFT JOIN
)应该表现相同(对于非可空列)并且通常会生成相同的执行计划除了不建议使用NOT IN
的mysql(或者在5.5之前不推荐,可能会更改)
我也会在原始查询中将GROUP BY
归咎于性能不佳......
答案 2 :(得分:0)
如果您只需要文章ID,请尝试以下方法:
SELECT
articleID
FROM relatedTable
GROUP BY articleID
HAVING MAX(relatedType) <= 3
或者您可以将此加入article
表格。