2012-02-12 17 views
0

MySQLでネストされたCASEに問題があります。私は、クエリを実行しようとしていますMySQLネストされたケース

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

次のように

rest_opening_hoursテーブルがあります。 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日目)と土曜日(7日目)の結果を(7日目ではなく)日曜日の1日目に返します。

DAYOFWEEK(NOW())= 1のとき、今日は日曜日(1日目)であり、h.days_of_week = 7のときは結果が "06:00"と返されます。 (ie、昨日の営業時間)h.hours_close < h.hours_openと推測しました。しかし、私は2つの結果を得ています: "06:00"と "23:00"は意味がありません。MySQLが2番目のケースを無視して、ちょうど両方を返すようなものです!

私はこれを使って周りを遊ぶのに過ごしたので、どこにもいないようです。

ありがとうございます!

ライアン

改正クエリ

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' 

私の問題は、1がh.hours_closeあるので、私のクエリは(1)(7)前日、問題の日の両方を選択していることであることが表示されます> h.hours_open、もう1つはh.hours_closeです。< h.hours_open - これを1つの結果に分離する方法についての説明はありません。おそらく、私は前日のものを見ています。時間は開始時間よりも短くなります(つまり、次の日を終了します)。擬似コードで

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

ヘイMosty、あなたの返信のおかげで。私は、h.hours_close Ryan

+0

昨日のようにこの 'select dayofweek(now()、dayofweek(now()、interval 1 day))を使用する必要があります。 –

+0

ありがとうMosty、that works私がやっていた-1よりも優れています。しかし、私はまだ同じ2つの結果を得ています...私は修正された質問を上記に入れました – Ryan