Есть три таблицы: events, events_categories, event_category_joins (связующая). Необходимо вывести записи с ближайшей датой сгруппированные по категориям. Версия mysql: 5.7.
Пример вывода без группировки:
Код с группировкой:
select `events`.`id`,
`events`.`date_public`,
`event_categories`.`id` as `cat_id`,
`event_categories`.`title` as `cat_title`
from `events`
inner join `event_category_joins` on `events`.`id` = `event_category_joins`.`event_id`
inner join `event_categories` on `event_categories`.`id` = `event_category_joins`.`event_category_id`
where `events`.`date_public` >= CURDATE()
group by `event_categories`.`id`
order by `events`.`date_public` asc;
Вывод:
Выводит не по ближайшей дате, а по наименьшему events.id.
Пробовал группировать через join, находить наименьшую дату и сравнивать с датой основной таблицы :
select `events`.`id`,
`events`.`date_public`,
`event_categories`.`id` as `cat_id`,
`event_categories`.`title` as `cat_title`
from `events`
inner join `event_category_joins` on `events`.`id` = `event_category_joins`.`event_id`
inner join `event_categories` on `event_categories`.`id` = `event_category_joins`.`event_category_id`
inner join (select `events`.`id` as `e_id`, min(`events`.`date_public`) as `min_date_public`
from `events`
inner join `event_category_joins` on `events`.`id` = `event_category_joins`.`event_id`
inner join `event_categories` on `event_categories`.`id` = `event_category_joins`.`event_category_id`
where `events`.`date_public` >= CURDATE()
group by `event_categories`.`id`) as `events_cat`
on `events`.`id` = `events_cat`.`e_id`
where `events`.`date_public` = `events_cat`.`min_date_public`
order by `events`.`date_public` asc;
Выводит таким образом:
Как выловить-таки минимальную дату?