2012-02-12 3 views
0

У меня проблема с вложенным 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 
} 

это так просто - почему это вызывает у меня столько проблем, проклятые!?!?!?

ответ

0

Бог благословит псевдокод. Это все, что мне нужно: это то, что вам нужно: Это то, что вам нужно:

select * from t1 
join (
    select restid, day_of_week, 
    if(hours_close < hours_open, 
     if(day_of_week = 1, 7, day_of_week - 1), 
     day_of_week 
    ) as NewDayOfWeek 
    from t1 
) as S 
on s.restid = t1.restid and s.day_of_week = t1.day_of_week 
+0

Привет, Мости, спасибо за ваш ответ. Я хочу только фильтровать к 7-му дню, если будет выполнено несколько условий, во-первых, что h.hours_close Ryan

+0

О, вы должны использовать этот 'select dayofweek (now()), dayofweek (date_sub (now(), interval 1 day)), как вчера' –

+0

Спасибо Мосты, что работает лучше, чем то, что я делал. Но я все равно получаю те же два результата ...Я поставил свой исправленный запрос выше – Ryan