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!?!?!?
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
Oh, vous devriez utiliser ce 'select dayofweek (maintenant()), dayofweek (date_sub (maintenant(), intervalle 1 jour)) comme hier' –
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