@dimakruglyak

SQL запрос по датам?

Формирую запрос
SELECT event_id, date, case
when date(date) = curdate() then '1'
when date(date) > curdate() then '2'
else '3' end as events_group FROM relationship_events_date ORDER BY events_group ASC

Получаю
3 | 2019-12-04 00:00:00 | 1
2 | 2019-12-04 00:00:00 | 1
5 | 2019-12-04 00:00:00 | 1
4 | 2019-12-14 00:00:00 | 2
4 | 2019-12-18 00:00:00 | 2
5 | 2019-12-25 00:00:00 | 2
3 | 2019-12-01 00:00:00 | 3
1 | 2019-11-20 00:00:00 | 3
1 | 2019-11-28 00:00:00 | 3
1 | 2019-12-03 00:00:00 | 3

При группировке

SELECT event_id, date, case
when date(date) = curdate() then '1'
when date(date) > curdate() then '2'
else '3' end as events_group FROM relationship_events_date GROUP BY event_id ORDER BY events_group ASC

Получаю

2 | 2019-12-04 00:00:00 | 1
5 | 2019-12-04 00:00:00 | 1
4 | 2019-12-14 00:00:00 | 2
3 | 2019-12-01 00:00:00 | 3
1 | 2019-11-20 00:00:00 | 3

Но вот какая штука, event_id должен относится к events_group 1 а он попадает в 3, так как при группировке берутся последний event_id

Посоветуйте плиз, что можно придумать
  • Вопрос задан
  • 82 просмотра
Пригласить эксперта
Ответы на вопрос 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
По стандарту при группировке (GROUP BY) в выборку могут входить только поля, по которым идёт группировка или агрегатные функции от других полей. MySQL допускает выборку других полей, но не гарантирует, что они будут браться из какой-то определённой строки.
Вы группируете по event_id, и у вас до группировки есть две строки с event_id = 3. Поскольку по полям date и events_group группировка не производится и по ним не берётся агрегатная функция, то они могут быть взяты из любой из этих двух строк.
Формально ваш запрос выглядит как
SELECT event_id, ANY_VALUE(date), ANY_VALUE(case ... as events_group)
  FROM relationship_events_date
  GROUP BY event_id
  ORDER BY events_group ASC
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы