[SQL] [Résolu] Requete avec COUNT et GROUP BY

Requete avec COUNT et GROUP BY [SQL] [Résolu] - SQL/NoSQL - Programmation

Marsh Posté le 07-04-2004 à 01:45:10    

Alors le soucis est le suivant.
J'ai 2 tables:
 

CENTRES        CENTRES_COMMENT    
----------     ------------------------------
num_centre     num_comment
...            #num_centre
               libelle_centre   ...

     
 
 
Je souhaite pour chaque enregistrement de CENTRES récupérer le nombre d'occurences contenues dans CENTRES_COMMENT. Même pour les centres pour lesquels il n'y a pas d'occurences.
La requête que j'ai faite est la suivante et ne me renvoie les centres que pour lesquels il y a des occurences dans la seconde table

Code :
  1. SELECT A.num_centre, count(B.num_centre)
  2. FROM centres A, centres_comment B
  3. WHERE A.num_centre = B.num_centre
  4. GROUP  BY A.num_centre


 
Avez vous une idée pour comment résoudre mon soucis.
Merci d'avance


Message édité par cybervince le 07-04-2004 à 04:06:48

---------------
SaulGoodman.fr: Actus sur la série Better Call Saul
Reply

Marsh Posté le 07-04-2004 à 01:45:10   

Reply

Marsh Posté le 07-04-2004 à 03:35:33    

c normal tu fais une jointure sur num_centre : ta clause where ne va te renvoyer que les enregistrement pour lesquels il existe qqc dans les 2 tables...


---------------
Jubi Photos : Flickr - 500px
Reply

Marsh Posté le 07-04-2004 à 03:38:53    

y doit y avoir moyen avec des select imbriqués...mais l ca dépasse mes compétences...


---------------
Jubi Photos : Flickr - 500px
Reply

Marsh Posté le 07-04-2004 à 03:39:50    

Oui, d'un autre coté, comment puis-je faire autrement que par cette jointure ?
Seule une imbrication de requêtes pourrait-elle me sortir de ce tracas ?


---------------
SaulGoodman.fr: Actus sur la série Better Call Saul
Reply

Marsh Posté le 07-04-2004 à 03:42:11    

Jubijub a écrit :

y doit y avoir moyen avec des select imbriqués...mais l ca dépasse mes compétences...


Ah ben pile poil pendant que je postai.
J'ai essayé une requête imbriquée justement, mais sans succès.
Il doit y avoir moyen mais je n'ai pas trouvé pour le moment.
Y'a bien une solution pour résoudre le problème au niveau du script PHP qui serait derrière, mais c'est pas la solution la plus "merisement" propre, car ca serait de créer des infos redondantes en base.


---------------
SaulGoodman.fr: Actus sur la série Better Call Saul
Reply

Marsh Posté le 07-04-2004 à 03:43:52    

Code :
  1. SELECT
  2. A.num_centre,
  3. (SELECT count(B.num_centre)
  4. FROM centres_comment B
  5. WHERE B.num_centre = A.num_centre)
  6. FROM centres A


 
 
c'est pas très beau mais ca fonctionne
(enfin de tête j'ai pas testé)


Message édité par cram le 07-04-2004 à 03:44:29
Reply

Marsh Posté le 07-04-2004 à 03:48:26    

Oui c'est la requête imbriquée (mode pas propre) à laquelle j'ai pensé, mais malheureusement niveau syntaxe, MySQL aime pas:
 

Code :
  1. SELECT A.num_centre, (
  2. SELECT count( B.num_centre )
  3. FROM centres_comment B
  4. WHERE B.num_centre = A.num_centre
  5. )
  6. FROM centres A
  7. MySQL a répondu:
  8. #1064 - You have an error in your SQL syntax near 'SELECT count( B.num_centre )
  9. FROM centres_comment B
  10. WHERE B.num_centre = A.num_' at line 2


 
Pourtant sur le papier d'après mes souvenirs, c'est censé marcher. Enfin jvois pas l'erreur


---------------
SaulGoodman.fr: Actus sur la série Better Call Saul
Reply

Marsh Posté le 07-04-2004 à 03:52:21    

SELECT A.num_centre, count(B.num_centre)
  FROM centres A LEFT OUTER JOIN centres_comment B
  WHERE A.num_centre = B.num_centre
  GROUP  BY A.num_centre
 
essaye ca...l'idée de faire une jointure externe...la jointure à gauche permet ici de récupérer les centres qui n'ont pas de commentaires...mais la syntaxe est peut etre à chier...


Message édité par Jubijub le 07-04-2004 à 03:53:51

---------------
Jubi Photos : Flickr - 500px
Reply

Marsh Posté le 07-04-2004 à 03:56:12    

Jubijub a écrit :

SELECT A.num_centre, count(B.num_centre)
  FROM centres A LEFT OUTER JOIN centres_comment B
  WHERE A.num_centre = B.num_centre
  GROUP  BY A.num_centre
 
essaye ca...l'idée de faire une jointure externe...la jointure à gauche permet ici de récupérer les centres qui n'ont pas de commentaires...mais la syntaxe est peut etre à chier...


 
#1064 - You have an error in your SQL syntax near 'WHERE A.num_centre = B.num_centre
GROUP  BY A.num_centre LIMIT 0, 30' at line 4
 
J'avais effectivement vu des OUTER JOIN dans la doc mais ne maitrisant pas la chose, j'ai pas insisté.


---------------
SaulGoodman.fr: Actus sur la série Better Call Saul
Reply

Marsh Posté le 07-04-2004 à 03:58:01    

c l'idée, parce que la jointure naturelle va de fait exclure les éléments qui n'ont pas d'équivalent dans l'autre table...
 
regarde la doc, parce que je crois que c vraiment le chemin...


---------------
Jubi Photos : Flickr - 500px
Reply

Marsh Posté le 07-04-2004 à 03:58:01   

Reply

Marsh Posté le 07-04-2004 à 03:59:16    

Wai, jvais me plonger dans le OUTER JOIN et bidouiller un peu dedans. Je finirai par trouver, car c'est obligé, cette requête elle doit exister.


---------------
SaulGoodman.fr: Actus sur la série Better Call Saul
Reply

Marsh Posté le 07-04-2004 à 04:02:22    

Code :
  1. SELECT A.num_centre, count(B.num_centre)
  2.   FROM centres A, centres_comment B
  3.   WHERE A.num_centre = B.num_centre(+)
  4.   GROUP  BY A.num_centre


 
juste en rajoutant la jointure externe  
 
par contre je sais plus si jointure externe et group by font bon menage ....

Reply

Marsh Posté le 07-04-2004 à 04:03:27    

SELECT A.num_centre, count(B.num_centre)
  FROM centres A LEFT OUTER JOIN centres_comment B  
  ON A.num_centre = B.num_centre
  GROUP  BY A.num_centre  
 
faut un "on" apparement :  
http://www.mysql.com/documentation [...] .html#JOIN


---------------
Jubi Photos : Flickr - 500px
Reply

Marsh Posté le 07-04-2004 à 04:04:01    

cram a écrit :

Code :
  1. SELECT A.num_centre, count(B.num_centre)
  2.   FROM centres A, centres_comment B
  3.   WHERE A.num_centre = B.num_centre(+)
  4.   GROUP  BY A.num_centre


 
juste en rajoutant la jointure externe  
 
par contre je sais plus si jointure externe et group by font bon menage ....


 
Nan il aime pas la syntaxe non plus.
Par contre le GROUP BY lui il est nécessaire il me semble dès lors qu'on veut faire un COUNT.


---------------
SaulGoodman.fr: Actus sur la série Better Call Saul
Reply

Marsh Posté le 07-04-2004 à 04:04:30    

cram a écrit :

Code :
  1. SELECT A.num_centre, count(B.num_centre)
  2.   FROM centres A, centres_comment B
  3.   WHERE A.num_centre = B.num_centre(+)
  4.   GROUP  BY A.num_centre


 
juste en rajoutant la jointure externe  
 
par contre je sais plus si jointure externe et group by font bon menage ....


 
c pas SQL compliant ;)...pas tous les SGBDR supportent cette notation


---------------
Jubi Photos : Flickr - 500px
Reply

Marsh Posté le 07-04-2004 à 04:05:33    

Jubijub a écrit :

SELECT A.num_centre, count(B.num_centre)
  FROM centres A LEFT OUTER JOIN centres_comment B  
  ON A.num_centre = B.num_centre
  GROUP  BY A.num_centre  
 
faut un "on" apparement :  
http://www.mysql.com/documentation [...] .html#JOIN


 
Oh yeah Jubijub, t'es mon sauveur.
Ca fait exactement ce que je voulai.
Tu m'a pris de vitesse dans la doc.
Merci beaucoup


---------------
SaulGoodman.fr: Actus sur la série Better Call Saul
Reply

Marsh Posté le 07-04-2004 à 04:08:50    

un truc a marquer sur le coin du bureau pour la prochaine fois ....
 
je le note :D

Reply

Marsh Posté le 07-04-2004 à 04:09:45    

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
Je tiens à préciser que :  
- je ne connais absolument pas mySQL, je m'en suis jamais servi de ma vie
- je suis une quiche en SQL, justement à cause des jointures dont j'ai du mal à maitriser les syntaxes (mais je débute hein)
 
Bref, résoudre un pb sans rien y connaitre, avec une solution SQL2 compliant, portable et standard, c la classe :sol:
 
Je suis très fier de moi sur ce coup..c immodeste au possible, mais tant pis :D


---------------
Jubi Photos : Flickr - 500px
Reply

Marsh Posté le 07-04-2004 à 04:13:39    

Clair que la syntaxe est notée de mon coté.
En effet Jubijub, chapeau si en plus t'es pas une bête en SQL.
Ensuite pour MySQL, j'avoue que ca respecte assez bien la syntaxe SQL standard (après tout, c'est un peu pour être standard que c'est utilisé)


---------------
SaulGoodman.fr: Actus sur la série Better Call Saul
Reply

Marsh Posté le 07-04-2004 à 04:19:50    

ben comme je suis étudiant, on nous forme aux standards...donc on fait du SQL92 le plus possible, sans trop coller aux dialectes SQL propres aux sgbdr...le +, c un dialect, le left join, c du standard...


---------------
Jubi Photos : Flickr - 500px
Reply

Marsh Posté le 07-04-2004 à 04:33:13    

En effet, tant que t'es étudiant, on te forme aux standards (SQL, Algorithmique...). Ensuite la mise en pratique sur le terrain n'est plus qu'une question de traduction. Le tout est d'avoir la logique de raisonnement. Une fois la requête écrite, il n'est plus bien compliqué de l'adapter à MySQL, Oracle ou DB2...


---------------
SaulGoodman.fr: Actus sur la série Better Call Saul
Reply

Marsh Posté le 07-04-2004 à 04:34:18    

c surtout que c plus facile qd t'a un oeil externe sur la requete...parce que qd t dedans, les choses les plus évidentes foutent le camp :D


---------------
Jubi Photos : Flickr - 500px
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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