Sélection sur table complexe
Bonjour à tous,
Je viens vous voir pour vous exposer un problème.
Je possède la table suivante :
Code:
1 2 3 4 5 6 7 8 9 10 11 12
| CREATE TABLE horaires (
client_id double unsigned NOT NULL,
debutPeriode date NOT NULL default '0000-00-00',
finPeriode date NOT NULL default '0000-00-00',
jour enum('0','1','2','3','4','5','6') collate utf8_swedish_ci NOT NULL,
ouverture1 time default NULL,
fermeture1 time default NULL,
ouverture2 time default NULL,
fermeture2 time default NULL,
note text collate utf8_swedish_ci NOT NULL,
PRIMARY KEY (client_id,debutPeriode,finPeriode,jour)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_swedish_ci ROW_FORMAT=COMPACT; |
Cette table contient les horaires d'ouverture de restaurants.
Les horaires d'ouverture peuvent varier à certaines période de l'année. (Ex: Pendant les 2 mois d'été)
Je souhaite, lors de la lecture de cette table, lire les horaires qui correspondent à la période actuelle. Je dois donc remplacer les horaires globaux (de période '0000-00-00') par la période concernée.
Dans l'ordre je fais donc :
- Select tous les horaires globaux
- Retire les horaires des jours concernés par une période particulière
- Ajoute a cette suppression les horaires des jours de la période particulière
Ce qui correspond au code :
Code:
1 2 3
| SELECT * FROM horaires WHERE client_id='2' AND debutPeriode = '0000-00-00' and jour not in ( SELECT jour FROM horaires as temp WHERE client_id='2' AND ((debutPeriode<=NOW() OR (YEAR(debutPeriode) = '0000' AND MONTH(debutPeriode) <= MONTH(NOW()) AND DAY(debutPeriode) <= DAY(NOW()) ) ) AND (finPeriode>=NOW() OR (YEAR(finPeriode) = '0000' AND MONTH(finPeriode) >= MONTH(NOW()) AND DAY(finPeriode) >= DAY(NOW()) ) )) ) UNION
( SELECT * FROM horaires as temp WHERE client_id='2' AND ((debutPeriode<=NOW() OR (YEAR(debutPeriode) = '0000' AND MONTH(debutPeriode) <= MONTH(NOW()) AND DAY(debutPeriode) <= DAY(NOW()) ) ) AND (finPeriode>=NOW() OR (YEAR(finPeriode) = '0000' AND MONTH(finPeriode) >= MONTH(NOW()) AND DAY(finPeriode) >= DAY(NOW()) ) )) ) |
Cette méthode fonctionne, mais elle répète deux fois la même sélection, et peut être y a-t-il moyen de directement remplacer les n-uplets concerné ?
Merci beaucoup si quelqu'un peut m'éclairer :)