count , jointure deux tables pour ramener une valeur 0

Petit nouveau ! | 2 Messages

05 janv. 2017, 17:47

Bonjour,
j’ai un problème en sql . je rappelle que j'utilise mysql
j'ai deux tables, la table agriculteur et la table permis
agiculteur(idag,nom, prenoms, ...)
permis ( idpermis ,idag, taille,...)

en utilisant count , j'obtiens le nombre de permis que possède un agriculteur .

SELECT idag,COUNT(*) as Nbrepermis FROM PERMIS GROUP BY idag ORDER BY idag ASC
Mais je veux que ma requete mette aussi la valeur 0 pour les agriculteurs qui n'ont pas encore eu de permis. j'ai vu des exemple de jointure,
mais sincèrement je n'arrive pas à écrire la requête.
Merci de donner un coup de main.
Cordialement

Avatar de l’utilisateur
Modérateur PHPfrance
Modérateur PHPfrance | 8755 Messages

05 janv. 2017, 18:44

salut,

si tu souhaite que le nb de permis passe par une sous requête. La jointure c'est si tu as besoin des données (jointure externe dans ton cas).
Dans ton cas la requête est bonne (bon tu le sais déjà) mais ne travaille que sur les données présentes dans la table permis, or toi tu veux te baser sur la table agriculteurs
ce qui donne
SELECT idag,
  nom,
  prenoms,
  (SELECT COUNT(1) FROM permis p WHERE p.idag = a.idag
  ) AS nbPermis
FROM agriculteur a
tu auras une colonne "nbPermis" pour chaque ligne de résultat avec les infos des agriculteurs

si tu veux afficher les permis de chaque agriculteur il te faudra une jointure externe (oui je sais déjà dit ;) ) et organiser une césure dans le code PHP pour afficher la chose proprement.

@+
Il en faut peu pour être heureux ......

Avatar de l’utilisateur
Administrateur PHPfrance
Administrateur PHPfrance | 13232 Messages

05 janv. 2017, 20:11

Ça pourrait se faire avec une simple jointure :

Code : Tout sélectionner

SELECT idag, nom, prenoms, COUNT(p.id) AS nbPermis FROM agriculteur AS a OUTER LEFT JOIN permis AS p ON a.idag = p.idag GROUP BY a.*
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Avatar de l’utilisateur
Modérateur PHPfrance
Modérateur PHPfrance | 8755 Messages

06 janv. 2017, 12:24

intéressant, je n'aurais pas pensé à faire comme ça.
petite correction syntaxique pour mysql (pas de a.*)
explain 
SELECT 
  a.idag,
  nom,
  prenoms,
  COUNT(p.idpermis) AS nbPermis
FROM 
  agriculteur AS a
left JOIN permis AS p
    ON a.idag = p.idag
GROUP BY
  a.idag,nom,prenoms
coté perf je me demande lequel est le mieux, les "explain" sont pas super clair :)

subselect
explain_subselect.png
jointure
explain_jointure.png
a priori je dirais le subselect qui n'utilise pas de table temporaire, mais sans être super certain.

@+
Vous ne pouvez pas consulter les fichiers insérés à ce message.
Il en faut peu pour être heureux ......

Petit nouveau ! | 2 Messages

06 janv. 2017, 15:28

merci , ça marche

Avatar de l’utilisateur
Modérateur PHPfrance
Modérateur PHPfrance | 8755 Messages

06 janv. 2017, 16:16

de rien, pense à cliquer sur résolu quand c'est le cas stp (en haut à droite du titre) ;)
je le fait pour toi cette fois :)

@+
Il en faut peu pour être heureux ......