Как выбрать несколько элементов из каждой группы в запросе MySQL? - PullRequest
3 голосов
/ 20 августа 2009

У меня есть некоторые данные форума в форме

сообщение (автор, идентификатор темы, текст)

Для каждого автора я хотел бы выбрать 10 различных идентификаторов thread_ids, связанных с этим автором (их может быть больше 10, и число будет варьироваться в зависимости от автора).

Я думаю об использовании GROUP BY для группировки по «автору», но я не могу понять, как выразить LIMIT для каждой группы и как развернуть каждую группу обратно в 10 строк.

1 Ответ

6 голосов
/ 25 августа 2009

Вот решение для запросов типа "top N на группу".

Обратите внимание, что вы должны выбрать , какие 10 темы для данного автора вы хотите. В этом примере я предполагаю, что вам нужны самые последние потоки (а thread_id - это значение с автоматическим приращением), а для случаев связей у вас есть первичный ключ posts.post_id.

SELECT p1.*
FROM post p1 LEFT OUTER JOIN post p2
 ON (p1.author = p2.author AND (p1.thread_id < p2.thread_id 
   OR p1.thread_id = p2.thread_id AND p1.post_id < p2.post_id))
GROUP BY p1.author
HAVING COUNT(*) < 10;

В ответе на следующий вопрос в комментарии, вот объяснение:

В топ-10 тем на автора мы можем сказать, что для каждого из них существует 9 или меньше других тем для этого автора, принадлежащих к набору результатов. Таким образом, для каждого поста автора (p1) мы подсчитываем, сколько постов (p2) одного автора имеют большую ветку. Если это число меньше 10, то пост автора (p1) относится к результату.

Я добавил термин для разрешения связей с post_id.

...