2012-02-12 3 views
0

Je rencontre un peu un problème avec CASE imbriqué dans MySQL.MySQL imbriqué CAS

Le tableau rest_opening_hours est la suivante:

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

Je suis alors en train d'effectuer une requête. La raison pour le WHEN DAYOFWEEK (NOW()) = 1 bit est que je remarque que si vous essayez d'emporter un dimanche (jour 1), il renvoie juste 1, ce qui provoque des problèmes.

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 

Voici quelques données de la table 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'); 

Mon seul problème est que ma requête retourne plusieurs enregistrements, et je ne vois pas vraiment pourquoi. La requête renvoie (un dimanche - jour 1) les résultats du dimanche (jour 1) et aussi du samedi (jour 7) et pas seulement du jour 7 comme je l'avais prévu dans ma requête !?

Je m'attendrais à ce que le résultat "06:00" soit retourné, comme aujourd'hui c'est dimanche (jour 1) et suivant la logique, quand DAYOFWEEK (NOW()) = 1 alors nous sélectionnons où h.days_of_week = 7 (c'est-à-dire, les heures d'ouverture d'hier) comme nous l'avons précédemment déduit que h.hours_close < h.hours_open. Cependant, je reçois deux résultats: "06:00" et "23:00" ce qui n'a aucun sens pour moi, c'est presque comme si MySQL ignorait le second cas et renvoyait juste les deux! ??!?! Quelqu'un peut-il faire la lumière sur ce sujet, car j'ai passé des années à jouer avec cela et je ne semble pas aller nulle part.

Merci d'avance!

Ryan

de la requête modifiée

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' 

Il semble que mon problème est que ma question est la sélection à la fois la veille (7) et le jour en question (1) parce que l'on est h.hours_close > h.hours_open et l'autre est h.hours_close < h.hours_open - tous les ides sur comment je pourrais isoler ceci à un seul résultat, peut-être une restructuration de sorte que je ne regarde que celui de la veille SI la clôture le temps est inférieur au temps d'ouverture (c'est-à-dire qu'il se ferme le jour suivant).

En pseudo-code:

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

il est si simple - pourquoi est-il me cause tant de problèmes damn!?!?!?

Répondre

0

Dieu bénisse le pseudo code. C'était tout ce dont j'avais besoin :) C'est ce que vous voulez:

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

Hey Mosty, merci pour votre réponse. Je veux seulement filtrer par jour 7 SI un certain nombre de conditions sont remplies, d'abord, que h.hours_close Ryan

+0

Oh, vous devriez utiliser ce 'select dayofweek (maintenant()), dayofweek (date_sub (maintenant(), intervalle 1 jour)) comme hier' –

+0

Merci Mosty, ça marche mieux que la chose -1 que je faisais. Mais je reçois toujours les mêmes deux résultats ...J'ai mis ma requête modifiée ci-dessus – Ryan