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


MySQL, get last active users in batches but prevent duplicate users in the next batch

我正在尝试提取在留言板中为特定主题做出贡献的用户。

每个请求将获得一批 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

我的问题是我如何能够防止这些可能的重复或至少获得最低post_id。

让我们假设一个主题有 100 个贡献用户和 50000 个由他们撰写的帖子,其中只有第一个帖子是由第三个用户发布的。

如果 LIMIT 为 10,则可以在 10 个

查询中获取所有 100 个用户。但这不是上述查询的工作方式:

如果只有十个用户发布 10000 到 50000,我的 ajax 查询将多次获得这些用户的请求。更糟糕的是...:

我可以丢弃所有这些请求,因为它们每次只会包含重复项。

减少查询量的"最佳"选项是什么?

一种可能的解决方案是查询 n, 10 个用户,但获得最低的post_id匹配,而不是这里的 max(( id。这样,我在某些情况下可以减少一些请求,但仅限于某些情况。

另一种方法是使用:

和 p.作者不在(之前查询的所有 uid 的列表(

但我想这会让问题变得更糟......^^ 比如:

SELECT * FROM X WHERE author_id NOT IN(1..to..4000000)...

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

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,这不是主键/唯一键,而只是users的外键。您获得重复项正是因为您在posts.author分组