MySQL Nested CASE - PullRequest
       13

MySQL Nested CASE

0 голосов
/ 12 февраля 2012

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

Может ли кто-нибудь пролить свет на это, поскольку я потратил целую вечность, играя с этим, и я, кажется, никуда не денусь.

Заранее спасибо!

Райан

Измененный запрос

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

В псевдокоде:

if (closingtime < openingtime) {
return closing time from yesterday
} else {
return closing time from today
}

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

1 Ответ

0 голосов
/ 12 февраля 2012

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

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
...