Вопрос SQL-запроса: X имеет много Y. Получите все X и получите только самые новые Y за X - PullRequest
1 голос
/ 30 апреля 2009

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

Меня перенаправили на присоединения и подзапросы, но я не могу понять.

Пример вывода:

Post1: Comment4 (самое новое для post1)

Post2: Comment2 (самое новое для post2)

Post3: Комментарий 10 (самый новый для post3)

и т.д ...

Любая помощь будет принята с благодарностью. Спасибо.

Ответы [ 4 ]

3 голосов
/ 30 апреля 2009

Этот ответ предполагает, что у вас есть уникальный идентификатор для каждого комментария, и это число увеличивается. То есть более поздние сообщения имеют более высокие номера, чем более ранние сообщения. Не должно быть последовательным, просто должно соответствовать порядку ввода.

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

Примерно так:

SELECT MAX(ID) MaxCommentID, PostID
FROM Comments
GROUP BY PostID

Это даст вам список идентификаторов постов и самый высокий (последний) идентификатор комментария для каждого.

Затем вы присоединитесь к этому, чтобы извлечь оставшиеся данные из комментариев для этих идентификаторов.

SELECT C1.*, C2.PostID
FROM Comments AS C1
     INNER JOIN (
         SELECT MAX(ID) MaxCommentID, PostID
         FROM Comments
         GROUP BY PostID
     ) AS C2 ON C1.CommentID = C2.MaxCommentID

Затем вы присоединяетесь к сообщениям, чтобы получить информацию об этих сообщениях.

SELECT C1.*, P.*
FROM Comments AS C1
     INNER JOIN (
         SELECT MAX(ID) MaxCommentID, PostID
         FROM Comments
         GROUP BY PostID
     ) AS C2 ON C1.CommentID = C2.MaxCommentID
     INNER JOIN Posts AS P ON C2.PostID = P.ID

Альтернативный подход вообще не использует PostID внутреннего запроса. Во-первых, выберите максимальный идентификатор комментария для всех уникальных постов, но не важно, какой пост, мы знаем, что он уникален.

SELECT MAX(ID) AS MaxCommentID
FROM Comments
GROUP BY PostID

Затем выполните предложение IN, чтобы получить оставшиеся данные для этих комментариев:

SELECT C1.*
FROM Comments
WHERE C1.ID IN (
    SELECT MAX(ID) AS MaxCommentID
    FROM Comments
    GROUP BY PostID
)

Тогда просто присоединяйтесь к сообщениям:

SELECT C1.*, P.*
FROM Comments AS C1
     INNER JOIN Posts AS P ON C1.PostID = P.ID
WHERE C1.ID IN (
    SELECT MAX(ID) AS MaxCommentID
    FROM Comments
    GROUP BY PostID
)
0 голосов
/ 30 апреля 2009

И если вам все еще нужно придерживаться старой версии mysql, которая не знает подзапросов, вы можете использовать что-то вроде

SELECT
  p.id, c1.id
FROM
  posts as p
LEFT JOIN
  comments as c1
ON
  p.id = c1.postId
LEFT JOIN
  comments as c2
ON
  c1.postId = c2.postId
  AND c1.id < c2.id
WHERE
  isnull(c2.id)
ORDER BY
  p.id
В любом случае, проверьте ваш запрос с помощью EXPLAIN на предмет проблем с производительностью.
0 голосов
/ 30 апреля 2009
 select *
   from post
      , comments
  where post.post_id = comments.post_id
    and comments.comments_id = (select max(z.comments_id) from comments z where z.post_id = post.post_id)
0 голосов
/ 30 апреля 2009

Выберите самый новый комментарий из подзапроса

* 1003 например *

Select * 
from Posts po
Inner Join
(
Select CommentThread, CommentDate, CommentBody, Post from comments a
inner join 
(select commentthread, max(commentdate)
from comments b
group by commentthread)
on a.commentthread = b.commentthread
and a.commentdate = b.commentdate
) co
on po.Post = co.post
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...