Requette mysql outer join

-
Bonjour, généralement je me débrouille toujours seul et grâce à ça , j’apprends bcp cependant je suis sur une colle dont je n'arrive pas a me dépêtrer!

Merci d'avance pour les pro des requettes!

J'ai actuellement 2 tables pour gerer mes RDVs:

La 1ere, liste les créneaux de rdv autorisées : id, date (datetime), temps (du créneau en min), actif
ex:
(1,"20190913 9:00:00", 20,1);
(2,"20190913 9:20:00", 20,1);
(3,"20190913 9:40:00", 20,1); ETC...
Ceux ci apparaissent dans un select HTML qui permet à mes clients de prendre RDV.
Si je désire bloquer un créneau, je n'ai qu'a le désactiver.


La 2eme, liste les RDVs eux même avec id, date_debut (datetime), date_fin (datetime), duree (en Min)
ex:
(1,"20190913 9:00:00","20190913 11:00:00", 120);
(2,"20190915 9:40:00","20190913 10:00:00", 20);


J'affiche la liste des créneaux autorisé et actif dans le select HTML. Jusque là pas de problème.
Par contre, je dois retirer des créneaux autorisé ceux qui sont déjà utilisé par les rdv. et je n'y arrive pas...

voici ma requette, cependant elle ne gère pas les RDVs qui prennent plusieurs créneaux consécutifs.

SELECT * FROM rdv
RIGHT OUTER JOIN dates_dispo ON rdv.date_debut = dates_dispo.date
UNION
SELECT * FROM rdv
LEFT OUTER JOIN dates_dispo ON rdv.date_debut = dates_dispo.date WHERE
dates_dispo.temps=20
and dates_dispo.actif='1'

Si j'ai un rdv de 9h00 à 11h00, les créneaux disponibles ne devraient ne pas etre visible dans cette plage cependant ma requette ne retire que le premier créneau de 9h00.
au lieu de retirer 9h00, 9h20, 9h40, 10h00, 10H20, 10h40


j'imagine que "rdv.date_debut = dates_dispo.date " est la cause et qu'il faudrait un between mais après plusieurs tests et heures je sèche...
J'ai aussi un doute sur la bonne forme de mon UNION, j'ai tenté avec FULL OUTER JOIN mais impossible.

Je ne sais pas si j'ai été assez clair dans mes explications, merci pour celui qui pourrait éclairer ma lanterne!
Afficher la suite 

3 réponses

Messages postés
8712
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
16 octobre 2019
436
0
Merci
bonjour, je suppose qu'il faut éliminer aussi un créneau partiellement utilisé par un rendez-vous?
tu n'expliques pas ce que tu souhaites que retourne ta requête: tous les créneaux utilisés, je suppose?
quelques suggestions:
1) supprimer la durée dans la table RDV (tu as déjà l'information avec le début et la fin)
2) pourquoi fais-tu une UNION, quel est le rôle de chacune des deux requêtes?
3) avant d'écrire des requêtes, réfléchis et décris la méthode à utiliser: que ferais-tu, à la main, pour obtenir le résultat. travailles avec des exemples. quand tu auras bien compris, tu pourras commencer à écrire la requête.
4) comment penses-tu obtenir le résultat en n'utilisant que la date de début de la table RDV?
Commenter la réponse de yg_be
Messages postés
1
Date d'inscription
vendredi 13 septembre 2013
Statut
Membre
Dernière intervention
16 septembre 2019
0
Merci
Bonjour, me revoici pour les précisions.
Il faut effectivement éliminer les créneaux partiellement utilisé.

"tu n'expliques pas ce que tu souhaites que retourne ta requête: tous les créneaux utilisés, je suppose?"
->En faite je veux plutôt lister les créneaux non utilisé dans un select HTML vu qu'il sont disponibles pour les clients.
Pour les durées, je préfère les garder car cela m'évite de faire des requettes compliquées pour d'autres utilisations.
(Les clients choissisent des RDVs de 20 min ou de 60 min selon la prestation qu'il demandent).

Si je n'arrive pas à faire cette requette, je serai obligé de bidouiller encore plus mais je déteste ca...

"comment penses-tu obtenir le résultat en n'utilisant que la date de début de la table RDV?"
->Justement avec la durée.

Concernant le UNION, je l'ai utilisé car avec MYSQL , FULL OUTER JOIN ne fonctionne pas j'ai donc du trouver sur le net une astuce que je comprend à peine...
http://patatos.over-blog.com/article-comment-faire-un-full-outer-join-avec-mysql-119606517.html

A savoir que la table des créneaux de rdv autorisées est générée par une fonction qui la peuple selon mes horaires d'ouverture, les vacances, etc... sur une période de 6 mois.


Merci pour ton intéret!
Commenter la réponse de shunshuk
Messages postés
8712
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
16 octobre 2019
436
0
Merci
pour commencer sur des bases solides, fais d'abord une requête sur les deux tables, qui pour chaque créneau, retourne tous les rendez-vous touchant à ce créneau.
quand cela fonctionnera bien, il sera facile de l'adapter pour trouver tous les créneaux libres.
Commenter la réponse de yg_be