Bonjour à tous,
Je viens vous voir pour vous exposer un problème.
Je possède la table suivante :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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