2012-02-12 106 views
0

我在MySQL中嵌套CASE有點問題。MySQL嵌套CASE

的rest_opening_hours表如下:

rest_opening_hours (
    restid int, 
    day_of_week int, 
    hours_open time, 
    hours_close time, 
) 

我則試圖執行一個查詢。 WHAY 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 - 關於如何將這個結果隔離到一個結果的任何ide,或許是重新排序,以便我只查看前一天的IF時間少於開放時間(即第二天關閉)。

僞代碼:

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 2012-02-12 06:49:30

+0

哦,你應該使用這個'select dayofweek(now()),dayofweek(date_sub(now(),interval 1 day))如昨天' – 2012-02-12 06:56:33

+0

Thanks Mosty,that works比我正在做的事更好。但我仍然得到相同的兩個結果...我已將上述修改的查詢放在 – Ryan 2012-02-12 07:03:24