MySQL сортирует записи по двум чередующимся статическим значениям - PullRequest
0 голосов
/ 03 апреля 2019

У меня есть таблица, полная данных, например:

ID      datetime            ip_address      marker
289055  2016-11-17 17:54:51 XX.XXX.XXX.XXX  End
289037  2016-11-17 17:54:51 XX.XXX.XXX.XXX  Start
289057  2016-11-17 17:58:56 XX.XXX.XXX.XXX  Start
289123  2016-11-17 17:59:18 XX.XXX.XXX.XXX  End
289184  2016-11-17 18:05:55 XX.XXX.XXX.XXX  End
289125  2016-11-17 18:05:55 XX.XXX.XXX.XXX  Start
289186  2016-11-17 18:12:22 XX.XXX.XXX.XXX  Start
289292  2016-11-17 18:18:44 XX.XXX.XXX.XXX  End

Я пытаюсь отсортировать данные по двум значениям («Начало», «Конец»), но «в полосе». Я имею в виду следующее:

ID      datetime            ip_address      marker
289037  2016-11-17 17:54:51 XX.XXX.XXX.XXX  Start
289055  2016-11-17 17:54:51 XX.XXX.XXX.XXX  End
289057  2016-11-17 17:58:56 XX.XXX.XXX.XXX  Start
289123  2016-11-17 17:59:18 XX.XXX.XXX.XXX  End
289125  2016-11-17 18:05:55 XX.XXX.XXX.XXX  Start
289184  2016-11-17 18:05:55 XX.XXX.XXX.XXX  End
289186  2016-11-17 18:12:22 XX.XXX.XXX.XXX  Start
289292  2016-11-17 18:18:44 XX.XXX.XXX.XXX  End

Обратите внимание, как столбец marker вращается между началом и концом (начало всегда будет первым, а конец всегда последним). Я верю, что то, чего я хочу достичь, возможно, но я не понимаю, как манипулировать этими данными в том, что я хочу. Я пробовал группировать или упорядочивать несколько разных запросов по разным столбцам, однако они всегда заканчиваются либо как первая таблица, либо как все записи с «Start» в виде marker, сгруппированных вместе, за которым следует «End».

Ответы [ 2 ]

2 голосов
/ 03 апреля 2019

В MySQL 8+ это просто:

order by row_number() over (partition by marker order by datetime),
         marker desc

Это намного сложнее в более ранних версиях MySQL.

0 голосов
/ 09 апреля 2019

Могу ли я предложить дополнение к вашему SELECT... для использования в вашем заказе.Например:

SELECT ID,datetime,ip_address,marker,
CASE WHEN marker='Start' THEN 1 WHEN marker='End' THEN 2 END AS 'mcheck'
FROM table
ORDER BY datetime,ipaddress,mcheck;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...