Вложенный случай MySQL

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

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


person Ryan    schedule 12.02.2012    source источник


Ответы (1)


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

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
person Mosty Mostacho    schedule 12.02.2012
comment
Эй Мости, спасибо за ваш ответ. Я хочу фильтровать только по 7-му дню, ЕСЛИ соблюдается ряд условий, во-первых, что h.hours_close ‹ h.hours_open (что означает, что ресторан открыт после полуночи) и, во-вторых, ЕСЛИ день воскресенье (день 1), потому что это необычное явление в MySQL, которое вы не можете просмотреть вчера в обычном формате DAYOFWEEK(NOW() - 1), потому что MySQL вернет '1' как DAYOFWEEK(NOW() - 1) - просто попробуйте SELECT DAYOFWEEK(NOW() - 1) в MySQL в воскресенье посмотреть... - person Ryan; 12.02.2012
comment
О, вы должны использовать это select dayofweek(now()), dayofweek(date_sub(now(), interval 1 day)) as yesterday - person Mosty Mostacho; 12.02.2012
comment
Спасибо, Мости, это работает лучше, чем -1, что я делал. Но я все еще получаю те же два результата... Я разместил свой измененный запрос выше. - person Ryan; 12.02.2012
comment
Проблема в том, что YourCustomMadeDay не всегда будет 7 — 7 будет только по воскресеньям. Так что завтра код не сработает. Можете ли вы взглянуть на псевдокод, который я сделал выше (отредактировал в оригинале)? Это более четко объясняет, чего я пытаюсь достичь. - person Ryan; 12.02.2012