Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Составление SQL-запросов > Получение последней записи при группировке.


Автор: Elfet 25.7.2011, 12:29
Всем привет! Прошу помощи разобраться в том как сделать следующее.


Есть таблица с сообщениями:
Код

message_id    message_user_id    message_sender_id    message_text    message_date
3    72589    72590    Hi Elfet! Its test123!    2011-07-22 15:35:36
5    72590    72589    Hi! I am Elfet;    2011-07-22 19:15:57
6    72589    72590    Ou. Realy?    2011-07-22 19:16:44
7    72590    72589    YES!    2011-07-22 19:22:23
9    72590    72589    ПРИВЕТ! ЭТО ELFET!    2011-07-25 12:23:14
10    72589    72591    Hi from Explorer!!!!    2011-07-25 13:12:43


Нужно сгруппировать сообщения по диалогам и вывести последнее сообщение.

Код

9    72590    72589    ПРИВЕТ! ЭТО ELFET!    2011-07-25 12:23:14
10    72589    72591    Hi from Explorer!!!!    2011-07-25 13:12:43



Я пробую делать так:
Код

SELECT * FROM `messages` WHERE `message_user_id`=72589 GROUP BY message_sender_id, message_user_id ORDER BY message_date DESC


Однако получаю вместо этого 
Код

10    72589    72591    Hi from Explorer!!!!    2011-07-25 13:12:43
3    72589    72590    Hi Elfet! Its test123!    2011-07-22 15:35:36


То есть первое сообщение из группы. 

Как получить последнее? Заранее спасибо!

Автор: Akina 25.7.2011, 14:09
Получить ID последней в каждой группе записи (having message_date=max(message_date)) в подзапросе.

Автор: Zloxa 25.7.2011, 14:17
Цитата(Akina @  25.7.2011,  14:09 Найти цитируемый пост)
having message_date=max(message_date)

 smile  smile 
не выспался?  smile 

Автор: Akina 25.7.2011, 18:26
ну... да, а что?

Автор: Elfet 25.7.2011, 18:50
Нет, это не работает :(

Автор: Zloxa 25.7.2011, 19:15
Цитата(Akina @ 25.7.2011,  18:26)
ну... да, а что?

Ну дык это... Если ты не группиируешься по message_date, ты не можешь его использовать в хавинге без аггрега....

Автор: Zloxa 25.7.2011, 19:42
Elfet, прошу прощения, но этот вопрос уже на столько уже оскомину набил, как и вопрос "как разместить иконку где часики" в формах по делфе. 

Классическое решение:
Код

select t.*
from messages t
inner join (
SELECT  message_sender_id, message_user_id,max(message_date ) max_message_date 
FROM `messages` 
GROUP BY message_sender_id, message_user_id 
) s
on t.message_sender_id = s.message_sender_id and t.message_user_id = s.message_user_id and t.message_date  = s.max_message_date 

Однако такой запрос даст более одного результата, если окажется более одного поста на одну дату, обычно так не нужно, нужен обычно один пост, обычно по наибольшему pk.
Чтобы добиться такого, поищите по форму по клюевому слову "бабушкин метод".
Для мйскл, в частности, можно попробовать еще такой трюк(при условии что message_id- PK):
Код

select * 
form messages 
where message_id in 
(select  (select message_id 
               from messages s 
               where s.message_sender_id = t.message_sender_id and s.message_user_id = t.message_user_id 
               order by message_date desc 
               limit 1
       ) max_date_message_id
from (
  SELECT  message_sender_id, message_user_id
  FROM `messages` 
  GROUP BY message_sender_id, message_user_id 
  ) t 
)  

Автор: Elfet 26.7.2011, 15:23
Всё оказалось как-то уж очень сложно. Ещё мне посоветовали почитать про cross apply. Но я думаю сделаю через ещё одну дополнительную таблицу (диалоги/топики)

Автор: Zloxa 26.7.2011, 15:31
Цитата(Elfet @  26.7.2011,  15:23 Найти цитируемый пост)
сделаю через ещё одну дополнительную таблицу 

Да, так - лучше.
Цитата(Elfet @  26.7.2011,  15:23 Найти цитируемый пост)
 Ещё мне посоветовали почитать про cross apply. 

Совет хороший, почитать стоит. Только применительно к вашей ситуации - бесползеный. У вас другая платформа.
Если хотите, посоветую почитать про keep или row_number(). Ими тоже можно получить желаемое, но не на MySQL.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)