Запрос, упорядочиваемый по количеству дней между двумя датами

#mysql

#mysql

Вопрос:

У меня есть база данных планировщика событий mysql , и я пытаюсь получить отчет о таблице городов, чтобы показать все города, упорядоченные по количеству дней для каждого события.

например, некоторые записи:

 event_id - city_id - start - end
1 - 88 - 2019-01-01 - 2019-01-05
2 - 89 - 2019-02-01 2019-02-03
3 - 90 - 2019-03-01 2019-03-04
4 - 88 - 2019-01-06 - 2019-01-07
  

Отчет может быть:

 city_id - days
  88    -  7
  90    -  4
  89    -  3
  

Комментарии:

1. Не могли бы вы отредактировать свой вопрос и прикрепить то, что вы пробовали до сих пор?

2. всегда ли существует — между датами 1 — 88 — 2019-01-01 — 2019-01-05 В некоторых строках нет —

Ответ №1:

вы можете сделать это с помощью запроса, подобного этому:

 SELECT event_id , city_id, SUM( DATEDIFF( `end`,`start`) 1 )  as days
FROM sample
GROUP BY city_id
order by SUM( DATEDIFF( `end`,`start`)  1  ) DESC;
  

пример

 MariaDB [test]> select * from sample;

 ---------- --------- ------------ ------------ 
| event_id | city_id | start      | end        |
 ---------- --------- ------------ ------------ 
|        1 |      88 | 2019-01-01 | 2019-01-05 |
|        2 |      89 | 2019-02-01 | 2019-02-03 |
|        3 |      90 | 2019-03-01 | 2019-03-04 |
|        4 |      88 | 2019-01-06 | 2019-01-07 |
 ---------- --------- ------------ ------------ 
4 rows in set (0.229 sec)

MariaDB [test]> 
MariaDB [test]> SELECT event_id , city_id, SUM( DATEDIFF( `end`,`start`) 1 )  as days
    -> FROM sample
    -> GROUP BY city_id
    -> order by SUM( DATEDIFF( `end`,`start`)  1  ) DESC;
 ---------- --------- ------ 
| event_id | city_id | days |
 ---------- --------- ------ 
|        1 |      88 |    7 |
|        3 |      90 |    4 |
|        2 |      89 |    3 |
 ---------- --------- ------ 
3 rows in set (0.001 sec)

MariaDB [test]> 
  

Комментарии:

1. большое вам спасибо! Я просто меняю порядок по дням вместо функции повторной суммы.

2. @Watanabe77 — у вас должна быть функция sum, если у вас более 1 раза один и тот же city_id, чтобы получить правильный результат

Ответ №2:

используйте приведенный ниже запрос —

 select 
   event_id, city_id, DATEDIFF(end, start) as days
 from 
   table_name
 order by DATEDIFF(end, start) desc
  

Комментарии:

1. Можете ли вы объяснить это подробнее? Как этот запрос может вернуть упорядоченный список?

2. Я просто написал запрос, чтобы получить количество дней между 2 датами. да, для упорядочения мы должны добавить предложение order by как «порядок по DATEDIFF (end, start) desc»