SQL带有ID限制的SELECT查询

4

假设我有一个数据库表(posts),其中包含字段IDMsgtime_id。用户(ID)可以发布任意数量的消息。

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

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

因为用户可以发布无限数量的消息,所以我需要避免显示来自同一用户的过多消息,因此我想将每个用户的帖子限制为最多3条,但仍然获取15条。
如何获取最近15条消息并确保我最多从任何一个用户那里获取三条消息,即使该用户在最近的15条消息中有超过3条消息?

你在寻找“GROUP”吗? - Mr. Alien
1
请发布您的表模式。 - Mihai
我认为GROUP在这里没有帮助,因为它会按用户(消息)折叠结果。在数据库层面上,没有逻辑可以应用来解决这个问题,需要在应用程序代码中处理。 - marekful
2个回答

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')
);

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;

然后从中进行Join或另一个select,并限制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),但我不确定这是否是最有效的方法。如果您经常需要此请求,建议您在单独的(去规范化的)表中运行第一个查询,并在需要时进行更新。

另外,如果您通过PHP运行它,则SELECT @N:= 0通常无法在连接中工作。它需要在先前的查询中单独完成。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接