Всем привет! В mysql базе данных моего сайта есть таблица сообщений - переписка пользователей друг с другом. Таблица имеет следующие поля: Код (Text): message_id | sender_id | recepient_id | subject | message | time В этой таблице содержится 4000000 записей. Мне необходимо из нее выбрать последние сообщения всех пользователей. Я пробовал делать выборку таким запросом: Код (Text): SELECT `sender_id`, `subject`, `message`, `time` FROM `messages` GROUP BY `sender_id` ORDER BY `time` DESC Запрос ошибок не выдает, выбирает по одному сообщению для каждого пользователя, но при проверке оказалось что он выбирает не последние сообщения. Подскажите в чем может быть ошибка и как правильно составить такой запрос.
Это всё из-за GROUP BY, сделай в два запроса: SELECT DISTINCT id, `sender_id` FROM `messages` ORDER BY `time` DESC а потом имея ID вытащи сами тексты. Если операция частая, то ябы переделал структуру так, чтобы ID последнего сообщения хранился в свойствах пользователя, или еще где
Код (Text): SELECT sender_id, subject, message, time FROM ( SELECT sender_id, subject, message, time, IF(sender_id = @sender, 0, 1) grouper, @sender := sender_id FROM messages, (select @sender := null) chao ORDER BY sender_id, time desc) byebye WHERE grouper = 1
Не вижу препятствий. Топик стартер не говорил, что требуется высокая скорость и оптимально оптимизированный запрос. Я лишь показал как это возможно сделать, а уже автору решать надо ему это или нет.
Код (Text): SELECT * FROM ( SELECT `sender_id`, `subject`, `message`, `time` FROM `messages` ORDER BY `time` DESC ) `m` GROUP BY `sender_id` ORDER BY `time` DESC; Код (Text): SELECT `sender_id`, `subject`, `message`, `time` FROM `messages` `m` WHERE `time`=(SELECT MAX(`time`) FROM `messages` WHERE `sender_id`=`m`.`sender_id`) ORDER BY `time` DESC - в данном случае лучше в WHERE заменить time на message_id, если между ними прямо пропорциональная связь. P.S. на скорость не тестировалось, но второй запрос медленнее по понятным причинам.
К сожалению Ваш запрос выдаёт результат который не соответствует задаче. MIN(`time`) - замените на MAX(`time`)