Сортировка таблицы по разным столбцам в зависимости от того, что происходит с другим столбцом - PullRequest
0 голосов
/ 06 декабря 2018

Я впервые задаю вопрос, а английский не является моим родным языком.Я прошу прощения за любые ошибки или неправильное поведение заранее.Теперь на мой вопрос: у меня есть стол, похожий на этот.(изображение 1) 1. Каждое забронированное время длится полчаса 2. Всегда есть booking_date, час и минута 3. У некоторых строк есть delivery_date, у некоторых еще нет 4. Delivery_date всегда ПОСЛЕ booking_date

неупорядоченная таблица

Если распечатывается, например, день (2018-12-01), я хочу, чтобы таблица была упорядочена по дате просмотра (2018-12-01)либо это booking_date ИЛИ delivery_date, который идет первым.И должен быть заказан (час, минута) каждого.Как показано ниже: (изображение 2)

В идеале упорядочено

Как вы можете видеть, оно переходит от строки 01 к 08, а затем обратно к 05, затем к 02. Это потому, чтозаказывать нужно по часам и минутам.И тем не менее, delivery_date имеет такой приоритет, что он прыгает между строками (например, строка 05)

Я пробовал этот SQL:

SELECT * FROM booking WHERE booking_date=$b_date OR DATE(delivery_date)=$b_date ORDER BY hour, minute ASC, HOUR(delivery_date), MINUTE(delivery_date) ASC

Это даст мне правильно упорядоченную дату booking_dateпо часам, минутам, но дата доставки не правильно упорядочена

Затем я также искал, нашел на Stackoverflow.com и попробовал это:

SELECT * FROM booking WHERE booking_date=$b_date OR DATE(delivery_date)=$b_date ORDER BY CASE WHEN booking_date=$b_date THEN hour, minute WHEN DATE(delivery_date)=$b_date  THEN HOUR(delivery_date), MINUTE(delivery_date) END ASC

Это дает мне следующую ошибку:

проверьте руководство, соответствующее версии вашего сервера MySQL, на предмет правильного синтаксиса, который можно использовать около 'минуты WHEN DATE (delivery_date) = $ b_date THEN HOUR (delivery_date), MINUTE (delivery_date) END' в строке1

и это запятая после «часа».Я так понимаю, запятой не нравится, поэтому я не могу использовать 2 столбца для ORDER BY.Когда я использую только один столбец, это работает, но минуты будут неправильными.Есть ли способ использовать 2 столбца в ORDER BY?

1 Ответ

0 голосов
/ 06 декабря 2018

Предложение THEN может указывать только одно значение.Вместо этого вы можете заказать по минутам:

SELECT *
FROM booking
WHERE booking_date=$b_date OR DATE(delivery_date)=$b_date
ORDER BY CASE WHEN booking_date=$b_date
                  THEN hour * 60 + minute
              WHEN DATE(delivery_date)=$b_date
                  THEN HOUR(delivery_date) * 60 + MINUTE(delivery_date)
         END ASC
...