Requete imbrique LEFT JOIN

R3NL0N1M0
Invité n'ayant pas de compte PHPfrance

07 juin 2005, 18:47

j'ai une table seances ( login_formateur, login_client, debut_seance, fin_seance ),
j'ai une table formateur ( login_formateur, nom_formateur, prenom_formateur, ... )

je veux les formateurs disponibles entre 10h00 et 11h00 aujourd'hui, donc j'ai fais une requete imbriqué :

SELECT login_formateur, nom_formateur, prenom_formateur FROM formateur WHERE login_formateur NOT IN (SELECT login_formateur FROM seances WHERE debut_seance < '2005-06-05 11:00:00' AND fin_seance > '2005-06-05 10:00:00' )
ici je recupère les login OQP , et du coup un SELECT NOT IN me donne les login libres

SAUF QUE SA MARCHE SUR MYSQL > 4.1 v voila mon probleme
j ai regardé les unions intersection création de table temp, left join, ETC
j ai pas trouvé alors je suis sure de passer a coté

Si quelqu'un pouvez m'eclairer ma lenterne bien sombre ... Merci

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

07 juin 2005, 18:55

Pas testé, mais ça devrait pas être loin...

Code : Tout sélectionner

SELECT F.login_formateur, F.nom_formateur, F.prenom_formateur FROM formateur F LEFT JOIN seances S ON F.login_formateur = S.login_formateur WHERE S.debut_seance < '2005-06-05 11:00:00' AND S.fin_seance > '2005-06-05 10:00:00' AND S.login_formateur IS NULL

R3NL0N1M0
Invité n'ayant pas de compte PHPfrance

07 juin 2005, 21:06

bin j'y est déjà pensé a sa!
Mais sa ne me renvoye rien du tout!
donc je suis toujours au mm point
merci kan mm

R3NL0N1M0
Invité n'ayant pas de compte PHPfrance

07 juin 2005, 21:18

Bon bin j'ai trouvé une solution mais je ne pense pas qu'elle soit bien:

j'utilise une table temporaire 'temp' dans laquelle je met le resultat des formateurs OQP ( SELECT login_formateur FROM seances S WHERE S.debut_seance < '2005-06-05 11:00:00' AND S.fin_seance > '2005-06-05 10:00:00' )

Ensuite je fais un LEFT JOIN avec la table formateur:

SELECT F.login_formateur, F.nom_formateur, F.prenom_formateur FROM formateurs F LEFT JOIN temp ON F.login_formateur=temp.login_formateur WHERE temp.login_formateur Is Null;

Et j'obtiens les formateurs disponibles dans l'interval.
Fonctionnel mais pas otpimisé.
Alors si vous trouvez mieux merci!!

CIAO CIAO

lnp
Invité n'ayant pas de compte PHPfrance

07 juin 2005, 21:54

SELECT login_formateur, nom_formateur, prenom_formateur
FROM formateur f, seances s
WHERE f.login_formateur = s.login_formateur
AND s.debut_seance < '2005-06-05 11:00:00' AND s.fin_seance > '2005-06-05 10:00:00'

Je ne sais pas si cela fonctionne !

LNP...
pour vous...

Mammouth du PHP | 19672 Messages

07 juin 2005, 22:04

Ça ne répond pas à la question Inp, il cherche les formateurs disponibles dans cette tranche horaire, pas ceux qui sont en séance comme ta requête va retourner
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Bak
Invité n'ayant pas de compte PHPfrance

08 juin 2005, 09:50

Si tu sais retrouver facillement les formateurs non disponibles, tu peux faire 2 requettes impriquées :
Ex :
SELECT login_formateur, nom_formateur, prenom_formateur
FROM formateur
WHERE login_formateur Not In ( SELECT login_formateur FROM seances
WHERE s.debut_seance < '2005-06-05 11:00:00' AND s.fin_seance > '2005-06-05 10:00:00' )

Je ne sais pas si ça marche dans MYSQL !

Bon courage
Si t'as pas comprit le principe fait moi signe, les requettes imbriqués évitent de créer des tables temporaires!

Bref,
@+ Quoi !

Bak
Invité n'ayant pas de compte PHPfrance

08 juin 2005, 09:55

J'avais pas lu le début des messages echangés !
Désolé R3NL0N1M0, ça ne répond pas à ta question.

Bref, @+ Quoi !

LNP
Invité n'ayant pas de compte PHPfrance

08 juin 2005, 09:57

BAK : je croyais que RENLONIMO avait déjà essayé cette requête et qu'elle ne le satisfaisait pas ! ! !

LNP...
pour vous...

Bak
Invité n'ayant pas de compte PHPfrance

08 juin 2005, 17:25

J'ai pas eu du temps pour me pencher sur ce sujet, mais je ne pense pas trouver une solution même en réfléchissant plus !!
Bref !

Je n'ai pas de solution pour une suppert requette !
Mais en tout cas tu peux ne pas utiliser de table temp (temporaire) en faisant une 1er requette : (SELECT distinct login_formateur FROM seances S WHERE S.debut_seance < '2005-06-05 11:00:00' AND S.fin_seance > '2005-06-05 10:00:00' ) mettre le résulta dans une variable du style :
...
Tanque pas fin d'enregistrement ...
strParam = strParam + ", " + enregitrement_en_cours
lire enregistrement suivant
Fin TQ

....

SELECT login_formateur, nom_formateur, prenom_formateur
FROM formateur
WHERE login_formateur Not In (" + strParam + ")"

.....


Faire attention a bien allimenté la variable strParam pour avoir un format corect pour une requette SQL !!

Bref, t'as compris le principe !!

@+ Quoi

R3NL0N1M0
Invité n'ayant pas de compte PHPfrance

08 juin 2005, 18:41

Mi té koné pas si ... je ne savais pas que l'on pouvait faire ce genre requête, efffectivement cela peut être intéressant , puisque sa évite de créer une table temp et de la remplir a chaque fois!
Et étant donné que je n'ai pas une tonne de formateur, alors j'ai ma première requete qui me sort les formateurs OQP --> concaténation dans une variable et séparé par une ','.
Puis Select les formateurs NOT IN la variable!

j'ai pas testé en entier mais sa m'a l'air fonctionnel aussi!

Merci a tous