compter les occurences dans une autre table

Invité
Invité n'ayant pas de compte PHPfrance

15 juin 2009, 13:13

Bonjour à tous,

J'ai une table qui contient un liste d'OPERATIONS, et une autre table qui contient des CODES.
Pour chaque opération, il y a plusieurs codes.
Chaque enregistrement CODES contient un champ idOperation qui reprend l'id de l'opération concernée, afin de faire la liaison.

Voici les tables:

Code : Tout sélectionner

CREATE TABLE `operations` ( `id` int(10) NOT NULL auto_increment, `nom` varchar(255) NOT NULL, `nomFichier` varchar(255) NOT NULL, `dateCrea` datetime NOT NULL, `dateExpi` datetime NOT NULL, `published` tinyint(1) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM; CREATE TABLE `codes` ( `id` int(10) NOT NULL auto_increment, `code` varchar(255) NOT NULL, `nbDwldAuto` int(10) NOT NULL, `nbDwldRea` int(10) NOT NULL, `idOperation` int(10) NOT NULL, `published` tinyint(1) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM;
Je peux lister toutes les opérations en faisant ceci:

Code : Tout sélectionner

SELECT * FROM operations
Ma question: comment faire pour ajouter aux résultats, le nombre de codes pour chaque opération?
J'ai tenté ceci:

Code : Tout sélectionner

SELECT ao.*, COUNT(ac.id) AS nbCodesDispo FROM operations AS ao, codes AS ac WHERE ac.idOperation = ao.id GROUP BY ac.id
Pas d'erreur, mais les résultats ne sont pas bons. J'ai une multitude de lignes pour les opérations, au lieu de quelques unes.

Voyez vous comment je devrais construire la requête?

Merci pour vos réponses.

Invité
Invité n'ayant pas de compte PHPfrance

15 juin 2009, 13:20

J'ai trouvé: c'est le GROUP BY ac.id qu n'est pas bon. Il pointe dur la table codes, au lieu de pointer sur la table operations.
Il faut faire un GROUP BY ao.id, et ça marche.

J'ai maintenant une liste d'opérations, et pour chaque opération, le nombre de codes est affiché dans les résultats.

Le hic: s'il n'y a pas de codes pour l'opération, l'opération concernée n'est pas affichée!
Comment faire pour afficher l'opération même s'il n'y a pas de codes correspondant?

Je sais qu'un LEFT JOIN sur la table codes permettrait de faire ça, mais je ne sais pas comment placer le COUNT, pour compter le nombre de codes pour chaque opération.

Merci pour un petit coup de main.

ViPHP
ViPHP | 2287 Messages

15 juin 2009, 14:47

Bonjour,

Bravo pour avoir pu régler par toi-même ton premier souci. On part donc de ça :

Code : Tout sélectionner

SELECT ao.*, COUNT(ac.id) AS nbCodesDispo FROM operations AS ao, codes AS ac WHERE ac.idOperation = ao.id GROUP BY ao.id
On peut réécrire pour plus de lisibilité comme ceci :

Code : Tout sélectionner

SELECT ao.*, COUNT(ac.id) AS nbCodesDispo FROM operations ao JOIN codes ac ON ac.idOperation = ao.id GROUP BY ao.id
Et à partir de là, le left join vient tout seul :

Code : Tout sélectionner

SELECT ao.*, COUNT(ac.id) AS nbCodesDispo FROM operations ao LEFT JOIN codes ac ON ac.idOperation = ao.id GROUP BY ao.id
Et voilà le travail :wink:
if(!@work()){ Nespresso(); } else { what(); }
______________________________

Invité
Invité n'ayant pas de compte PHPfrance

15 juin 2009, 15:33

merci bcp, c parfait

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

15 juin 2009, 16:15

Modération :
Puisque ta question est résolue, j'ajoute le tag [Résolu]
pour indiquer aux personnes qui voudront consulter ce sujet qu'il contient une solution.

Tu peux réaliser cette opération toi-même
en cliquant sur le bouton Image qui s'affiche en haut à gauche de ce sujet
si tu as posté le 1er message en tant que membre (inscrit et identifié).

Alors... inscris-toi !!! ;)
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