У меня возникла небольшая проблема с вложенным CASE в MySQL.
Таблица rest_opening_hours выглядит следующим образом:
rest_opening_hours (
restid int,
day_of_week int,
hours_open time,
hours_close time,
)
Затем я пытаюсь выполнить запрос. Причина бита WHEN DAYOFWEEK( NOW()) = 1 заключается в том, что я заметил, что если вы попытаетесь забрать в воскресенье (день 1), он просто вернет 1, что вызывает проблемы.
SELECT h.hours_close
FROM restaurants s
INNER JOIN rest_opening_hours h
ON s.id = h.restid
WHERE
CASE
WHEN h.hours_close > h.hours_open
THEN h.day_of_week = DAYOFWEEK(NOW())
ELSE
CASE
WHEN DAYOFWEEK(NOW()) = 1
THEN h.day_of_week = 7
ELSE
h.day_of_week = DAYOFWEEK(NOW() - 1)
END
END
AND s.id = '2'
LIMIT 0 , 30
Вот некоторые данные из таблицы rest_opening_hours:
INSERT INTO `rest_opening_hours` (`restid`, `day_of_week`, `hours_open`, `hours_close`) VALUES
(2, 1, '17:00:00', '23:00:00'),
(2, 7, '17:00:00', '06:00:00'),
(2, 6, '17:00:00', '00:00:00'),
(2, 5, '17:00:00', '01:00:00'),
(2, 4, '17:00:00', '02:00:00'),
(2, 3, '03:00:00', '23:00:00'),
(2, 2, '17:00:00', '04:00:00');
Моя единственная проблема в том, что мой запрос возвращает несколько записей, и я действительно не понимаю, почему. Запрос возвращает (в воскресенье - день 1) результаты для воскресенья (день 1), а также для субботы (день 7), а не только для дня 7, как я предполагал в своем запросе!?
Я ожидаю, что будет возвращен результат «06:00», так как сегодня воскресенье (день 1), и, следуя логике, когда DAYOFWEEK(NOW()) = 1, мы выбираем, где h.days_of_week = 7 (т. е. вчерашний день). часы работы), поскольку мы ранее сделали вывод, что h.hours_close ‹ h.hours_open. Однако я получаю два результата: «06:00» и «23:00», что для меня не имеет смысла, это почти как если бы MySQL игнорирует второй случай и просто возвращает оба!??!?!
Может ли кто-нибудь пролить свет на это, так как я потратил целую вечность, играя с этим, и, похоже, я ничего не получаю.
Заранее спасибо!
Райан
Исправленный запрос
SELECT h.hours_close
FROM restaurants s
INNER JOIN rest_opening_hours h ON s.id = h.restid
WHERE
CASE
WHEN h.hours_close > h.hours_open
THEN h.day_of_week = DAYOFWEEK( NOW( ) )
ELSE h.day_of_week = DAYOFWEEK( DATE_SUB( NOW( ) , INTERVAL 1 DAY ) )
END
AND s.id = '2'
Похоже, моя проблема заключается в том, что мой запрос выбирает как предыдущий день (7), так и рассматриваемый день (1), потому что один из них - h.hours_close > h.hours_open, а другой - h.hours_close ‹ h.hours_open - любые идеи о том, как я мог бы выделить это только для одного результата, возможно, своего рода реструктуризации, чтобы я смотрел только на тот, который был за день до того, ЕСЛИ время закрытия меньше, чем время открытия (то есть оно закрывается на следующий день).
В псевдокоде:
if (closingtime < openingtime) {
return closing time from yesterday
} else {
return closing time from today
}
это так просто - почему это вызывает у меня столько чертовых проблем!?!?!?