MySQL, получите последних активных пользователей в пакетах, но предотвратите дублирование пользователей в следующем пакете

Я пытаюсь извлечь пользователей, вносящих вклад в определенную тему на доске объявлений.

Каждый запрос получает партию из 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 написанными ими сообщениями, где только один из первых сообщений был сделан третьим пользователем.

С ЛИМИТОМ 10 можно было бы получить все 100 пользователей в 10 запросах. Но вышеприведенные запросы работают не так:

Если бы сообщения от 10000 до 50000 были сделаны только десятью пользователями, мои ajax-запросы могли бы получить этих пользователей несколько раз для многих запросов. И еще хуже …

Я мог бы выбросить все эти запросы, потому что они будут содержать только дубликаты каждый раз.

Что будет «лучшим» вариантом для уменьшения количества запросов?

Одним из возможных решений было бы запросить n, 10 пользователей, но получить наименьшее соответствие post_id, а не здесь max () id. Таким образом, я мог немного уменьшить количество запросов в некоторых случаях, но только в некоторых.

Другим способом было бы использовать:

AND p.author NOT IN (список всех запросов, запрошенных ранее)

Но это, я думаю, усугубит проблему … ^^

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

1

Решение

Вы перебираете сообщения, а не пользователей, а вам нужно перебирать пользователей. Я думаю, что это может сработать:

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

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector