Mysql 限制ID的SQL选择

Mysql 限制ID的SQL选择,mysql,sql,Mysql,Sql,假设我有一个数据库表posts,其中包含ID、Msg和time_ID字段。用户ID可以发布任意数量的消息 我可以通过以下方式提取最后15条消息: SELECT * FROM posts ORDER BY time_id DESC LIMIT 0,15 因为一个用户可以发布不受限制的消息,所以我需要避免显示来自一个用户的太多消息,所以我想限制一个用户最多发布3条消息,但仍然可以获取15条消息 如何获取最近15条消息,并确保我从任何可能在最近15条消息中有3条以上帖子的用户处获取最多3条消息,这可

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

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

SELECT * FROM posts ORDER BY time_id DESC LIMIT 0,15
因为一个用户可以发布不受限制的消息,所以我需要避免显示来自一个用户的太多消息,所以我想限制一个用户最多发布3条消息,但仍然可以获取15条消息


如何获取最近15条消息,并确保我从任何可能在最近15条消息中有3条以上帖子的用户处获取最多3条消息,这可能会对您有所帮助。您需要为此启动两个查询

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

您可以使用此技巧获取每个帖子在用户中的位置

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
这是可行的,但我不确定这是最有效的方法。如果您经常需要此请求,我建议您在单独的非规范化表中运行第一个查询,并在需要时进行更新


另外,如果通过PHP运行,SELECT@N:=0通常在联接中不起作用。它需要在前面的查询中单独完成。

是否要查找组?发布您的表架构。我认为组在这里没有帮助,因为这样会折叠每个用户消息的结果。您无法在数据库层应用任何逻辑来解决此问题,请在应用程序代码中执行此操作。可能存在重复的