Получение определенного количества результатов из связанной таблицы в SQL Server - PullRequest
1 голос
/ 04 марта 2012

У меня есть сообщения и таблица комментариев:

Post (id, title)
Comment(id, postid, comment, commentdate)

Я пытаюсь выбрать последние 10 сообщений, которые были прокомментированы с датами комментариев.Каков запрос для получения этого?

Пример:

Если я пытался получить последние 3 сообщения:

Post
---
1 P1
2 P2
3 P3
4 P4

Comment
---
1 1 C1 01:01
2 3 C2 01:02
3 3 C3 01:03
4 2 C4 01:04
5 2 C5 01:05
6 1 C6 01:06
7 4 C7 01:07
8 4 C8 01:08

Exptected result:
---

4 P4 01:08
1 P1 01:06
2 P2 01:05

Поиск таблицы комментариев из последней записи вВ столбце postid я нахожу 4, 1 и 2 соответственно (и отличительно).Я нахожу 3 комментария и останавливаюсь там.

Ответы [ 3 ]

2 голосов
/ 04 марта 2012

Я думаю, что самый простой верный подход - что-то вроде этого:

SELECT TOP 10
       id,
       title,
       (SELECT MAX(commentdate)
          FROM comment
         WHERE postid = post.id
       ) AS commentdate
  FROM post
 ORDER BY commentdate DESC
;

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

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

SELECT TOP 10
       id,
       title,
       (SELECT MAX(commentdate)
          FROM comment
         WHERE postid = post.id
       ) AS commentdate
  FROM post
 WHERE id IN
        ( SELECT TOP 100
                 postid
            FROM comment
           ORDER BY commentdate DESC
        )
 ORDER BY commentdate DESC
;

, который находит сообщения, к которым относятся 100 последних комментариев & mdash; максимум 100 сообщений & mdash; а затем применяет вышеуказанный подход только к этим сообщениям. (Причина, по которой он может вернуть менее десяти сообщений, состоит в том, что все 100 последних комментариев могут принадлежать только девяти сообщениям - или только пяти сообщениям, или только одному сообщению.)

(Отказ от ответственности: я не проверял ни один из вышеуказанных запросов.)

1 голос
/ 04 марта 2012

Попробуйте:

SELECT      TOP 3 Post.postId
            , Post.post
            , latestComment.leftAt
FROM        Post
            INNER JOIN (
                SELECT      postId
                            , MAX(leftAt) AS leftAt
                FROM        Comment
                GROUP BY    postId
            ) AS latestComment
              ON    Post.postId = latestComment.postId
ORDER BY    latestComment.leftAt DESC
            , Post.postId

Рабочая SQLFiddle

0 голосов
/ 04 марта 2012
DECLARE @n INT = 3; -- or 10, or whatever

;WITH x AS
(
    SELECT
        postid, commentdate,
        rn = ROW_NUMBER() OVER (ORDER BY commentdate DESC)
      FROM dbo.comment AS c
), y AS 
(
  SELECT postid, rn = MIN(rn) FROM x
  GROUP BY postid
)
SELECT TOP (@n) p.postid, p.title, x.commentdate
FROM x INNER JOIN y ON x.rn = y.rn
INNER JOIN dbo.post AS p ON p.postid = x.postid
ORDER BY x.commentdate DESC;

Или немного проще:

DECLARE @n INT = 3; -- or 10, or whatever

;WITH x AS 
(
    SELECT TOP (@n) postid, t = MAX(commentdate)
    FROM dbo.comment
    GROUP BY postid ORDER BY t DESC
)
SELECT p.postid, p.title, commentdate = x.t 
FROM x INNER JOIN dbo.post AS p ON x.postid = p.postid
ORDER BY x.t DESC;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...