1
可以想象我有类似以下的查询:如何将多个子查询优化到同一数据集
SELECT
u.ID,
(SELECT
COUNT(*)
FROM
POSTS p
WHERE
p.USER_ID = u.ID
AND p.TYPE = 1
) AS interesting_posts,
(SELECT
COUNT(*)
FROM
POSTS p
WHERE
p.USER_ID = u.ID
AND p.TYPE = 2
) AS boring_posts,
(SELECT
COUNT(*)
FROM
COMMENTS c
WHERE
c.USER_ID = u.ID
AND c.TYPE = 1
) AS interesting_comments,
(SELECT
COUNT(*)
FROM
COMMENTS c
WHERE
c.USER_ID = u.ID
AND c.TYPE = 2
) AS boring_comments
FROM
USERS u;
(希望这是正确的,因为我只是想出了它,并没有测试)
我尝试计算用户拥有的有趣和无聊的帖子和评论的数量。
现在,这个查询的问题是,我们有两个顺序扫描posts
和comments
表,我不知道是否有办法避免这种情况?
我大概可以LEFT JOIN
users
表的帖子和评论,并做了一些聚合,但它会在聚合之前产生大量的行,我不知道如果这是一个好方法。
您可以使用解释来获得查询成本的近似概念,并使用小的更改进行优化。 –
是的,尝试两个LEFT JOIN +(条件)聚合。 – wildplasser
@wildplasser我使查询有点复杂。我与左连接的问题是,它会在聚合之前生成用户*注释*发布行,这可能是很多行,并且可能会减慢查询速度。 – JustMichael