MySQL получить последнюю запись для группы - PullRequest
6 голосов
/ 25 февраля 2012

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

post_comment_id, post_id, writer_user_id, post_comment_content, datetime

Я сгруппировал результаты по post_id примерно так:

SELECT * FROM post_comments GROUP BY post_id

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

Ответы [ 3 ]

16 голосов
/ 25 февраля 2012

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

Вы можете получить дату последнего комментария для каждого post_id, как это.

select post_id, MAX(datetime) as latest from post_comments group by post_id

Используйте его, чтобы выбрать последний комментарий:

SELECT t1.* FROM post_comments AS t1
JOIN (
    SELECT post_id, MAX(datetime) AS latest FROM post_comments GROUP BY post_id
) AS t2
ON t1.post_id = t2.post_id AND t1.datetime = t2.latest
2 голосов
/ 25 февраля 2012

Как много вопросов приходит с «Я хочу последнюю запись для ...», и у них есть определенное время.Если в рассматриваемой таблице используется автоинкремент, и отметка даты / времени ВСЕГДА будет оставаться в последовательной корреляции времени ... т.е.из 3 недель назад ... так многие будут пытаться назначить эту последнюю дату и снова присоединиться к некоммерческому ключу.Просто получите ключ максимального идентификатора для сообщения и используйте его ... У меня будет индекс для идентификатора сообщения и первичный ключ автоинкремента.

select
      P2.*
   from
      ( select post_id, max( post_comment_id ) as LastPost
           from post_comments
           group by post_id ) LastPerPost
         JOIN post_comments P2
            on LastPerPost.LastPost = P2.post_comment_id
0 голосов
/ 25 февраля 2012

Сортировка! Я сделал это так:

SELECT * FROM (
    SELECT * FROM post_comments ORDER BY datetime DESC
) AS post_comments 
GROUP BY post_id
...