假设我有一个包含字段ID, Msg and time_id
的数据库表(帖子)。用户(ID)可以发布任意数量的消息。
我可以通过以下方式提取最后15条消息:
SELECT * FROM posts ORDER BY time_id DESC LIMIT 0,15
由于用户可以发布无限量的消息,我需要避免显示来自一个用户的过多消息,所以我想限制一个用户最多3个帖子,但仍然可以获取15个。
如何获取最近15条最近的消息,并确保在最近15条消息中可能拥有3条以上帖子的用户最多获得3条消息
答案 0 :(得分:0)
这可能会对你有所帮助。你需要为此启动两个查询。
SELECT DISTINCT(userid) FROM `users` GROUP BY userid ORDER BY insertdate ASC LIMIt 3
for(){
SELECT msg FROM `msgtable` WHERE userid = forloopuserid ORDER BY insertdate DESC LIMIT 0,3
//store data in a user array
}
您的数组可能如下所示:
array(1=>array('msg1','msg2','msg3'),
2=>array('msg1','msg2','msg3')
);
答案 1 :(得分:0)
您可以使用此技巧获取用户
中每个帖子的位置SELECT id, USER, @n:=if(USER=@last_user, @n+1, 0) AS n , @last_user:=USER
FROM posts, (SELECT @n:=0) init
ORDER BY USER, time_id;
然后从中进行加入或其他选择并限制n< 3:
SELECT posts.* FROM posts JOIN (
SELECT id, USER, @n:=if(USER=@last_user, @n+1, 0) AS n , @last_user:=USER
FROM posts, (SELECT @n:=0) init
ORDER BY USER, time_id) ranked USING (id)
WHERE n < 3
ORDER BY time_id
LIMIT 15
它有效(见sqlfidle),但我不确定这是最有效的方法。如果您经常需要此请求,我建议您在单独的(denormilazed)表中运行第一个查询,并在需要时更新它。
另外,如果你通过PHP运行它,SELECT @N:=0
通常在连接中不起作用。它需要在先前的查询中单独完成。