Php MySQL,批量获取最后一个活动用户,但在下一批中防止重复用户

Php MySQL,批量获取最后一个活动用户,但在下一批中防止重复用户,php,mysql,unique,distinct,packets,Php,Mysql,Unique,Distinct,Packets,我试图在留言板中提取对特定主题有贡献的用户 每个请求获得一批10个唯一用户 问题是,如果某些用户在上一批中的某一部分进行访问,那么他们也可能在下一批中进行访问 SELECT p.post_id as id, p.author as uid, a.name FROM posts p INNER JOIN users a ON a.id = p.author AND p.topic_id = __TOPIC_ID__ AND p.post_id < __OFFSET_POST_ID__

我试图在留言板中提取对特定主题有贡献的用户

每个请求获得一批10个唯一用户

问题是,如果某些用户在上一批中的某一部分进行访问,那么他们也可能在下一批中进行访问

SELECT p.post_id as id, p.author as uid, a.name 
FROM posts p 
INNER JOIN users a 
ON  a.id = p.author
AND p.topic_id = __TOPIC_ID__
AND p.post_id < __OFFSET_POST_ID__
GROUP BY p.author 
ORDER BY MAX(p.post_id) 
DESC LIMIT 10

您正在迭代帖子,而不是用户,而您需要迭代用户。我认为这可能会奏效:

SELECT u.id, u.name, max(p.post_id)
FROM users u
INNER JOIN posts p ON p.author = u.id
WHERE p.topic_id = :topic_id
GROUP BY u.id
ORDER BY max(p.post_id) DESC
LIMIT 10 OFFSET :offset;

如您所见,我对users.id主键进行分组,而不是posts.author,它不是主键/唯一键,只是用户的外键。你得到的重复项正是因为你对帖子进行分组。author

我还建议你将posts.author重命名为posts.author\u id或posts.user\u id,这样你就知道它是一个id。而且,在用户中的PK称为id,而在帖子中则是post\u id,这也让人困惑。当你或其他人稍后阅读时,命名惯例非常重要。简单但天才。谢谢
SELECT u.id, u.name, max(p.post_id)
FROM users u
INNER JOIN posts p ON p.author = u.id
WHERE p.topic_id = :topic_id
GROUP BY u.id
ORDER BY max(p.post_id) DESC
LIMIT 10 OFFSET :offset;