У меня проблема с вложенным CASE в MySQL.MySQL Вложенные CASE
Таблица 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 - любые ides на том, как я мог бы выделить это только один результат, возможно, реструктуризацию сортов, так что я только смотрю на нее за день до того, время меньше времени открытия (т. е. закрывается на следующий день).
В Псевдо-код:
if (closingtime < openingtime) {
return closing time from yesterday
} else {
return closing time from today
}
это так просто - почему это вызывает у меня столько проблем, проклятые!?!?!?
Привет, Мости, спасибо за ваш ответ. Я хочу только фильтровать к 7-му дню, если будет выполнено несколько условий, во-первых, что h.hours_close
Ryan
О, вы должны использовать этот 'select dayofweek (now()), dayofweek (date_sub (now(), interval 1 day)), как вчера' –
Спасибо Мосты, что работает лучше, чем то, что я делал. Но я все равно получаю те же два результата ...Я поставил свой исправленный запрос выше – Ryan