Aidez moi à finaliser ma requête SQL !!!

Aidez moi à finaliser ma requête SQL !!! - Algo - Programmation

Marsh Posté le 27-09-2002 à 14:31:34    

Salut
 
J'ai un petit problème pour la construction d'une requête MySQL :
 
Soit deux tables : 'departement' et 'voiture' par exemple.
departement :
 dep_id
 dep_num
 dep_is_dom
 
voiture :
 voiture_id
 voiture_dep_id
 voiture_desc
 
Comment faire pour construire une requête qui permette de connaître le nombre de voiture par département.
Actuellement, j'ai quelque-chose qui marche à peu près mais elle me retourne uniquement les departements ayant au moins une voiture.
 
Ce que je souhaite, c'est avoir tous les départements qui ne sont pas d'outre-mer et chacun avec son nombre de voiture, même si c'est 0.
 
Voici ma requête actuelle :
SELECT dep_num, COUNT(*) AS nb_voiture FROM departement, voiture WHERE dep_is_dom = FALSE AND voiture_dep_id = dep_id GROUP BY dep_id
 
Merci de votre aide[s]

Reply

Marsh Posté le 27-09-2002 à 14:31:34   

Reply

Marsh Posté le 27-09-2002 à 14:57:15    

Essaie ca :
SELECT dep_num, COUNT(voiture_id) FROM departement LEFT JOIN voiture ON voiture_dep_id = dep_id WHERE dep_is_dom = FALSE GROUP BY dep_id

Reply

Marsh Posté le 27-09-2002 à 15:04:03    

:love:  :love:  :love:  
C'est génial, ça marche.
 
Histoire de ne pas mourrir con, c'est quoi ça le "LEFT JOIN voiture ON voiture_dep_id = dep_id", je n'ai jamais vu !
 :love:  :love:  :love:

Reply

Marsh Posté le 27-09-2002 à 16:05:25    

Il fait la jointure avec une 2ème table (avec le ON ...). Si il y a plusieurs lignes de la 2ème table qui correspondent, ca revient à une jointure normale.
Mais s'il n'y en a pas, tu aura quand même la ligne de la 1ère table. Ca permet de récupérer tous les éléments de la 1ère table, et pas seulement ceux qui ont un correspondant dans la 2ème.

Reply

Marsh Posté le 31-01-2006 à 16:37:33    

Ta requete ecrite en syntaxe ANSI SQL92 donne  
 
SELECT dep_num, COUNT(*) AS nb_voiture FROM departement
JOIN voiture on (voiture_dep_id = dep_id )
WHERE dep_is_dom = FALSE AND GROUP BY dep_id
 
Il s'agit d'une jointure droite :
Tu as a gauche la table departement (celle sur laquelle tu requete) et a droite la table voiture (lié par la relation : ici dep_id vers voiture_dep_id).
Avec une jointure droite l'enregistrement de gauche ne sort que si il existe un enregistrement correspondant à droite. Dans ton cas tu n'as l'enregistrement departement que si il existe une voiture dans ce departement.
 
Tu peux ecrire une la même requete avec une jointure gauche :
 
SELECT dep_num, COUNT(*) AS nb_voiture FROM departement
LEFT JOIN voiture on (voiture_dep_id = dep_id)
WHERE dep_is_dom = FALSE AND GROUP BY dep_id
 
Dans ce cas l'enregistrement de gauche sort même s'il n'existe pas d'enregistrement à droite.
L'interet de cette syntaxe c'est que tu sépare bien ce qui est de l'ordre du filtrage (WHERE dep_is_dom = FALSE) de ce qui correspond a la condition de la jointure (voiture_dep_id = dep_id).
 
A+


Message édité par m3z le 31-01-2006 à 16:51:24
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed