Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 29/11/2011, 21h32   #1
Membre confirmé
 
Développeur informatique
Inscription : décembre 2008
Messages : 344
Détails du profil
Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : décembre 2008
Messages : 344
Points : 292
Points : 292
Par défaut Remplacer des select imbriqués par une jointure

Bonjour,

Considérons 2 tables définissable comme suit :

tache(INT id_tache, VARCHAR nom_tache)
dates(INT id_dates, INT #tache_date, INT debut_dates, INT fin_date)

avec date.tache_date une clef étrangère vers tache. Chaque "tache" peut avoir plusieurs "dates", la tables dates définissant une date de début et une date de fin pour l’exécution d'une tâche (stockées sous forme de timestamp, donc en INT).

Actuellement, si je veux afficher la liste des taches dont la 1er occurrence se situe dans un intervalle donné, je n'ai rien trouvé de mieux à faire que :

Code :
SELECT * FROM tache WHERE (SELECT min(dates.debut_dates) FROM dates WHERE dates.tache_dates = tache.id_tache) BETWEEN X AND Y
(ou X et Y sont des valeurs numériques)

Seulement vous en conviendrez, ce n'est pas le meilleur moyen de faire (surtout si en plus je veux trier les résultats par date de la 1er occurrence), et je suis persuadé qu'on doit pouvoir faire pareil avec des JOIN...

Quelqu'un pourrait m'aider à comprendre la bonne démarche ?

En vous remerciant par avance
comode est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/11/2011, 09h21   #2
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 655
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 655
Points : 2 657
Points : 2 657
bonjour,

Il n'y a pas de solution sans sous-requête pour ce genre de cas.


Une autre approche, si vous voulez pouvoir trier par date :
Code :
1
2
3
4
5
 
SELECT a.*, B.debut_dates
FROM tache a
INNER JOIN (SELECT id_tache, min(debut_dates) AS debut_dates FROM dates GROUP BY id_tache) b ON a.id_tache = b.id_tache 
WHERE b.debut_dates BETWEEN X AND Y
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/11/2011, 14h01   #3
Membre confirmé
 
Développeur informatique
Inscription : décembre 2008
Messages : 344
Détails du profil
Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : décembre 2008
Messages : 344
Points : 292
Points : 292
Merci beaucoup !

Voila qui règle mon problème de ré-exploitation du résultat du sous select.
comode est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 00h35.


 
 
 
 
Partenaires

Hébergement Web