2012-04-16 53 views
8

我有一张表,其中包含许多不同作者的博客文章。我想要做的是显示最近10位作者中的每一位最近发表的文章。MySQL - 最近10位作者中的每一位选择最近一篇文章

每位作者的帖子都按顺序添加到表格中,这意味着可以由单个作者运行帖子。我有一段时间想出一个单一的查询来做到这一点。

这给了我最近10个独特的作者ID;可以将它用作每个作者最近发布的子选择吗?

SELECT DISTINCT userid 
FROM posts 
ORDER BY postid DESC 
LIMIT 10 

回答

3
select userid,postid, win from posts where postid in (
SELECT max(postid) as postid 
FROM posts 
GROUP BY userid 
) 
ORDER BY postid desc 
limit 10 

http://sqlfiddle.com/#!2/09e25/1

+0

这很接近 - 它会为每个用户标识返回最近的postid,但行中的其余数据不会比赛。例如,这是行不通的:SELECT userid,title,bodytext,MAX(id)id FROM帖子GROUP BY userid ORDER BY id DESC LIMIT 10 – 2012-04-16 21:36:09

+0

right如果你想要所有的字段,不幸的是你需要一个子查询。我编辑了我的答案。 – 2012-04-16 21:43:26

+0

非常好,谢谢。这是完美的。 – 2012-04-16 21:49:06

1

您需要每个作者的最后一个postid的子查询和postid DESC的顺序。然后,该结果加入到posts表:

SELECT B.* FROM 
(
    SELECT * FROM 
    (
     SELECT userid,MAX(postid) postid 
     FROM posts GROUP BY userid 
    ) AA 
    ORDER BY postid DESC 
    LIMIT 10 
) A INNER JOIN posts B 
USING (user_id,post_id); 

请确保您有此指数

ALTER TABLE posts ADD INDEX user_post_ndx (userid,postid); 
+0

你不应该需要对用户ID的复合索引,作为postID的postID无论如何都是唯一标识符,并且仅存在于正在发布帖子的一个作者。 – DRapp 2012-04-16 21:35:38

+0

@DRapp需要使用该复合索引来加速子查询AA(完整索引扫描vs全表扫描) – RolandoMySQLDBA 2012-04-16 22:13:14

1
SELECT userid 
    , MAX(postid) AS lastpostid 
FROM posts 
GROUP BY userid 
ORDER BY lastpostid DESC 
LIMIT 10