带有ID限制的SQL SELECT

时间:2013-11-19 11:35:46

标签: mysql sql

假设我有一个包含字段ID, Msg and time_id的数据库表(帖子)。用户(ID)可以发布任意数量的消息。

我可以通过以下方式提取最后15条消息:

SELECT * FROM posts ORDER BY time_id DESC LIMIT 0,15

由于用户可以发布无限量的消息,我需要避免显示来自一个用户的过多消息,所以我想限制一个用户最多3个帖子,但仍然可以获取15个。

如何获取最近15条最近的消息,并确保在最近15条消息中可能拥有3条以上帖子的用户最多获得3条消息

2 个答案:

答案 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通常在连接中不起作用。它需要在先前的查询中单独完成。