MySQL,批量获取最后的活跃用户,但防止下一批次中的重复用户

时间:2015-02-16 18:06:09

标签: 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__
GROUP BY p.author 
ORDER BY MAX(p.post_id) 
DESC LIMIT 10

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

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

如果LIMIT为10,则可以在10个查询中获得所有100个用户。但这不是上述查询的工作方式:

如果只有10个用户发布了10000到50000,那么我的ajax查询会为许多请求多次获取这些用户。更糟糕的是......:

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

什么是最好的&#34;减少查询量的选项?

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

另一种方法是使用:

AND p.author NOT IN(之前查询过的所有uid列表)

但是这会让问题变得更糟,我猜... ^^喜欢:

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

1 个答案:

答案 0 :(得分:0)

您需要迭代用户,而不是迭代帖子,而不是用户。我认为这可能会成功:

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

上进行分组