Что-то не могу придумать запросик. Вот есть примерно такая схема Код (Text): create table dialogs ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, PRIMARY KEY (`id`) ) ENGINE=InnoDB; CREATE TABLE `messages` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `dialog_id` int(11) NOT NULL, `text` text COLLATE utf8mb4_unicode_ci NOT NULL, `created_at` timestamp NULL DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB; insert into dialogs set id = 1; insert into dialogs set id = 2; insert into messages set dialog_id=1, `text`='hello 1.1', created_at = '2017-03-28 10:20:00'; insert into messages set dialog_id=1, `text`='hello 1.2', created_at = '2017-03-28 10:21:00'; insert into messages set dialog_id=2, `text`='hello 2.1', created_at = '2017-03-27 10:30:00'; insert into messages set dialog_id=2, `text`='hello 2.2', created_at = '2017-03-27 10:31:00'; http://sqlfiddle.com/#!9/8c3c28 - но там что-то на sql-fiddle не работает, там 504-ая с ajax-запросами. Так вот. Можно ли выбрать одним запросам только самые ранние сообщения по каждому dialog_id? Мне пока в голову приходит только вложенный подзапрос, но может можно позже?
Нормальное, но не лучшее. Это будет вычисляться много запросов в одном, мне не нравится. Может кто-то предложит лучше. Если нет - сделаю подзапрос или денормализую таблицы
В такой задаче выбирать лучше или не лучше не приходится Код (Text): SELECT * FROM messages m1 WHERE (m1.dialog_id, m1.created_at) = ( SELECT m2.dialog_id, MIN(m2.created_at) FROM messages m2 GROUP BY m2.dialog_id )
есть как минимум 5 способов, см http://sqlinfo.ru/articles/info/18.html (второй, кстати, без так нелюбимых вами подзапросов) на практике, бывает оправдана денормализация, например, б.д. форума может хранить последнее сообщение для каждого раздела