Выберите N строк из таблицы с неуникальным внешним ключом - PullRequest
2 голосов
/ 24 апреля 2009

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

Так же, как Этот вопрос Я хочу вернуть N строк в зависимости от значения в столбце.

Мой пример: у меня есть блог, в котором я хочу показать свои сообщения вместе с предварительным просмотром комментариев. Последние три комментария будут точными.

У меня есть все, что мне нужно для моих постов, но я ломаю голову, чтобы получить правильные комментарии. Таблица комментариев имеет внешний ключ post_id, который, очевидно, может содержать несколько комментариев к одному сообщению, поэтому, если сообщение содержит 20 комментариев, я просто хочу вернуть последние три. Что делает это несколько сложным, так это то, что я хочу сделать это одним запросом, а не запросом с ограничением 3 для каждого сообщения в блоге, что делает отображение страницы с большим количеством сообщений очень сложным.

SELECT *
FROM replies
GROUP BY post_id
HAVING COUNT( post_id ) <=3

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

Ответы [ 3 ]

3 голосов
/ 24 апреля 2009
SELECT  l.*
FROM    (
        SELECT  post_id,
                COALESCE(
                (
                SELECT  id
                FROM    replies li
                WHERE   li.post_id = dlo.post_id
                ORDER BY
                        li.post_id, li.id
                LIMIT 2, 1
                ), CAST(0xFFFFFFFF AS DECIMAL)) AS mid
        FROM    (
                SELECT  DISTINCT post_id
                FROM    replies dl
                ) dlo
        ) lo, replies l
WHERE   l.replies >= lo.replies
        AND l.replies <= lo.replies
        AND l.id <= lo.mid

Наличие индекса на replies (post_id, id) (в этом порядке) значительно улучшит этот запрос.

Обратите внимание на использование l.replies >= lo.replies AND l.replies <= lo.replies: это делает индекс доступным для использования.

Подробности смотрите в статье в моем блоге:

0 голосов
/ 25 апреля 2009

по идее Яна Джейкобса

объявить @PostID int

select top 3 post_id, comment
from replies
where post_id=@PostID
order by createdate desc
0 голосов
/ 24 апреля 2009

Вы отслеживаете дату комментария? Вы можете отсортировать эти результаты, чтобы получить только 3 самых последних.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...