MySQL выбирает порядок GROUP BY - PullRequest
9 голосов
/ 19 декабря 2011

У меня есть заявление mysql

SELECT * 
FROM tbl_messages 
WHERE to_user_id = '$user_id' OR from_user_id = '$user_id' 
GROUP BY from_user_id 
ORDER BY date_sent DESC

и это дает правильные результаты, однако они не в правильном порядке.

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

Есть ли способ отображения последней записи для каждой группы?

2011-12-19 12:16:25 This is the first message
2011-12-19 12:18:20 This is the second message
2011-12-19 12:43:04 This is the third message

Группа показывает «Это первое сообщение», где я хочу «Это третье сообщение», поскольку это самая последняя запись / сообщение.

Приветствия

Ответы [ 4 ]

9 голосов
/ 19 декабря 2011

Это может работать (но не гарантировано):

SELECT * 
FROM
  ( SELECT *
    FROM tbl_messages 
    WHERE to_user_id = '$user_id' OR from_user_id = '$user_id' 
    ORDER BY date_sent DESC
  ) tmp
GROUP BY from_user_id 
ORDER BY date_sent DESC

Это должно работать:

SELECT t.* 
FROM 
    tbl_messages AS t
  JOIN
    ( SELECT from_user_id 
           , MAX(date_sent) AS max_date_sent
      FROM tbl_messages 
      WHERE to_user_id = '$user_id' OR from_user_id = '$user_id' 
      GROUP BY from_user_id 
    ) AS tg
    ON  (tg.from_user_id, tg.max_date_sent) = (t.from_user_id, t.date_sent)
ORDER BY t.date_sent DESC
8 голосов
/ 30 апреля 2013

Выполните GROUP BY после ORDER BY, поместив запрос в GROUP BY следующим образом:

SELECT t.* FROM (SELECT * FROM table ORDER BY time DESC) t GROUP BY t.from
2 голосов
/ 19 декабря 2011

Если ваша таблица сообщений имеет первичный ключ, который является автоинкрементом, и все сообщения по своей природе имеют наибольшее число, то это самая последняя дата ... Однако, поскольку я НЕ ЗНАЮ это, я собираюсь основываться на MAX(date_sent) вместо max (SomeIDKey), но принцип тот же.

select
      tm2.*
   from
      ( select tm1.from_user_id, 
               max( tm1.date_sent ) LatestMsgDate
           from tbl_messages tm1
           group by tm1.from_user_id ) MaxPerUser

      left join tbl_messages tm2
         on MaxPerUser.From_User_ID = tm2.From_User_ID
        AND MaxPerUser.LatestMsgDat = tm2.Date_Sent

   order by
      date_sent DESC
0 голосов
/ 19 декабря 2011

Вы имеете в виду что-то вроде этого:

SELECT * FROM tbl_messages WHERE to_user_id = '$user_id' OR from_user_id = '$user_id' GROUP BY from_user_id ORDER BY from_user_id, date_sent DESC

...