Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
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 27/12/2011, 12h22   #1
Invité de passage
 
Inscription : juillet 2006
Messages : 2
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 2
Points : 0
Points : 0
Par défaut SQL condition GROUP BY

Bonjour,

Après plusieurs heures de tutoriaux et recherche en tout genre je trouve pas de solution. Tout aide ou piste sera la bienvenue !

Je possède une table :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
ID_objet        ID_utilisateur        date_insertion
--------        ------------          -------------
    1	             1 	                    D 
    2	             1 	                    D 
    3 	             1 	                    D 
    1 	             2 	                    D 
    2 	             2 	                    D 
    3 	             2 	                    D 
    1 	             2 	                    D 
    2 	             2 	                    D 
    3 	             2 	                    D
Un requête précédente m'envoie les ID_objets qui m'intéresse.
Ainsi :

Code :
1
2
3
4
5
6
7
 
// $liste_id_objet contient les ID sous forme ID_objet=1 || ID_objet = 2 || ID_objet=3 pour notre exemple.
SELECT p.ID_objet,p.ID_utilisateur,m.nom 
FROM pla AS p 
     LEFT JOIN mem AS m 
          ON p.ID_utilisateur=m.ID_utilisateur
WHERE $liste_id_objet
Cette requête me renvoi correctement chaque ligne avec le nom de l'utilisateur.
J'aimerai maintenant savoir pour chaque ID_objet combien de ligne possède chacun des utilisateurs présent.
J'ai donc pensé à COUNT et la clause GROUP BY ID_objet

Code :
1
2
3
4
5
6
7
 
SELECT p.ID_objet,COUNT(p.ID_utilisateur),m.nom 
FROM pla AS p 
     LEFT JOIN mem AS m 
          ON p.ID_utilisateur=m.ID_utilisateur 
WHERE $liste_id_objet
GROUP BY p.ID_objet

Il regroupe bien les lignes selon les ID_objet et m'affiche correctement le nombre de ligne.
La ou ça coince, c'est qu’évidemment qu'il ne me ressort qu'une seul ligne par ID_objet du fait du GROUP BY ID_objet. Hors il me faudrait autant de ligne qu'il y a d'utilisateur par objet :


il me sort donc :

ID_objet COUNT(ID_utilisateur) date_insertion Nom
-------- ------------ ------------- ------
1 1 D XXX
2 2 D XXX
3 2 D XXX


Il semble me sortir l'ID_utilisateur qu'il rencontre en dernier.
Hors j'aimerai qu'il me réponde :

Code :
1
2
3
4
5
6
7
8
9
 
ID_objet   ID_utilisateur    COUNT(ID_utilisateur)     Nom
--------   ------------     -------------    ------
    1 	             1 	                    1              XXX
    1 	             2 	                    2              XXX
    2 	             1 	                    1              XXX
    2 	             2 	                    2              XXX
    3 	             1 	                    1              XXX 
    3 	             2 	                    2              XXX
J'ai pensé à DISTINCT mais après avoir tester pas mal de truc, rien ne passe.

Au pire si j'y arrive pas, je traiterai tout ça en php. Mais il me semble qu'il est possible de le faire en SQL. Alors autant apprendre


Merci à toute aide !
supermeganono est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/12/2011, 12h28   #2
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 686
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 686
Points : 10 435
Points : 10 435
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Vous n'étiez pas très loin de la solution, il suffit de rajouter les utilisateurs dans le group by :
Code :
1
2
3
4
5
6
  SELECT p.ID_objet, p.ID_utilisateur, COUNT(m.ID_utilisateur)
    FROM pla AS p 
         LEFT JOIN mem AS m 
           ON m.ID_utilisateur = p.ID_utilisateur 
   WHERE $liste_id_objet
GROUP BY p.ID_objet, p.ID_utilisateur
Sinon, je ne suis pas vraiment convaincu de l'utilité de la jointure externe ici.
__________________
Email : http://scr.im/waldar
Waldar est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/12/2011, 12h37   #3
Invité de passage
 
Inscription : juillet 2006
Messages : 2
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 2
Points : 0
Points : 0
Un grand Merci Waldar.

En effet, après avoir été relire un peu les tutoriaux, ce n'est pas LEFT JOIN ici mais bien INNER JOIN qu'il faut.
supermeganono 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 18h58.


 
 
 
 
Partenaires

Hébergement Web