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 个 post 由他们编写,其中第一个 post 中只有一个是由第三个用户创建的。
如果 LIMIT 为 10,则可以在 10 个查询中获取所有 100 个用户。但这不是上述查询的工作方式:
如果 post 10000 到 50000 只由 10 个用户进行,我的 ajax 查询将多次获得这些用户的请求。更糟糕的是......:
我可以丢弃所有这些请求,因为它们每次只会包含重复项。
减少查询量的 "best" 选项是什么?
一个可能的解决方案是查询 n, 10 个用户,但得到最低的 post_id 匹配而不是这里的 max() id。这样我可以在某些情况下减少请求,但仅限于某些情况。
另一种方法是使用:
AND p.author NOT IN(之前查询的所有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
,这不是 primary/unique 键,只是 [=13= 的外键].你得到重复项正是因为你在 posts.author
上分组
我正在尝试提取对留言板中特定主题做出贡献的用户。
每个请求获得一批 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 个 post 由他们编写,其中第一个 post 中只有一个是由第三个用户创建的。
如果 LIMIT 为 10,则可以在 10 个查询中获取所有 100 个用户。但这不是上述查询的工作方式:
如果 post 10000 到 50000 只由 10 个用户进行,我的 ajax 查询将多次获得这些用户的请求。更糟糕的是......:
我可以丢弃所有这些请求,因为它们每次只会包含重复项。
减少查询量的 "best" 选项是什么?
一个可能的解决方案是查询 n, 10 个用户,但得到最低的 post_id 匹配而不是这里的 max() id。这样我可以在某些情况下减少请求,但仅限于某些情况。
另一种方法是使用:
AND p.author NOT IN(之前查询的所有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
,这不是 primary/unique 键,只是 [=13= 的外键].你得到重复项正是因为你在 posts.author