简单的任务。我有博客系统,我需要获得TOP5(通过观点)的帖子,但来自不同的作者(例如,如果一个作者非常受欢迎,我不需要他们的所有五个帖子。)
如果首先选择TOP5作者然后从每个作者中选择最受欢迎的帖子,那么可以轻松完成。但问题是:它可以在一个查询中完成吗?
答案 0 :(得分:2)
假设你有一个auto_increment id:
SELECT p1.*
FROM posts p1
JOIN (
SELECT p2.author, p2.views, MAX(p2.id) author_max_id
FROM posts p2
JOIN (
SELECT p3.author, MAX(p3.views) author_max_views
FROM posts p3
GROUP BY p3.author
ORDER BY author_max_views
LIMIT 5
) pii
ON p2.author = pii.author
AND p2.views = pii.author_max_views
GROUP BY p2.author, p2.views
ORDER BY p2.views
LIMIT 5
) pi
ON p1.author = pi.author
AND p1.views = pi.views
AND p1.id = pi.author_max_id
ORDER BY p1.views
LIMIT 5;
我不得不双重嵌套,以避免作者有多个帖子,其中有一个视图=该作者的最大观看次数。
这可以改写为更简单的东西......例如,你在两个子查询中不需要ORDER BY x LIMIT 5
,但我希望它们能加速查询。