0

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');

私の唯一の問題は、クエリが複数のレコードを返すことですが、その理由はよくわかりません。クエリは、クエリで意図した7日目だけでなく、日曜日(1日目)と土曜日(7日目)の結果を(日曜日-1日目)返します!?

今日は日曜日(1日目)であり、論理に従ってDAYOFWEEK(NOW())= 1の場合、h.days_of_week = 7(つまり、昨日の営業時間)以前にh.hours_close<h.hours_openと推定したとおりです。ただし、「06:00」と「23:00」の2つの結果が得られます。これは私には意味がありません。まるで、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'

私の問題は、一方がh.hours_close> h.hours_openで、もう一方がh.hours_close <h.hours_openであるため、クエリが前日(7)と問題の日の(1)の両方を選択していることです。これを1つの結果に分離する方法については、おそらく、閉店時間が開店時間よりも短い場合(つまり、翌日閉店する場合)に前日の1つだけを表示するように再構築します。

擬似コードの場合:

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

それはとても単純です-なぜそれは私にとても多くのひどい問題を引き起こしているのですか!?!?!?

4

1 に答える 1

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
于 2012-02-12T06:26:36.010 に答える