Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1626 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  jointure + count

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

jointure + count

n°1395841
nORKy
Grmmph...
Posté le 27-06-2006 à 16:26:00  profilanswer
 

Je voudrais faire une jointure avec un count
Je m'explique
J'ai une table avec une liste de groupe différent (donc id unique)
Dans cette table 'groups', on a 'group_id' (unique) et 'group_name'
Dans une autre table a a des droits, il peut y avoir plusieurs ou aucun droit rataché à un groupe
Dans cette table 'aacls', on a notamment champs 'aacl_group_id'
 
Je voudrais en une seule requete avoir ma liste de groupe (la clause where ci dessous la concernant est correct) et le nombre de droits qu'il lui sont lié
J'ai essayé un ça :

Code :
  1. SELECT groups.*, COUNT(aacls.aacl_group_id) AS num_aacls
  2. FROM groups
  3. LEFT OUTER JOIN aacls ON aacls.aacl_group_id = groups.group_id
  4. WHERE entity_id='$entity_id' OR entity_id='0'


 
Mais j'ai cette erreur :

Code :
  1. Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause


 
comment faire ?

mood
Publicité
Posté le 27-06-2006 à 16:26:00  profilanswer
 

n°1395850
alien_nan
Posté le 27-06-2006 à 16:36:48  profilanswer
 

 

Code :
  1. SELECT
  2. groups.group_id, COUNT(groups.group_id)
  3. FROM groups
  4. LEFT OUTER JOIN aacls ON aacls.aacl_group_id = groups.group_id
  5. WHERE entity_id='$entity_id' OR entity_id='0'
  6. group by groups.group_id
  7. having count(groups.group_id)>0

 

n°1395851
anapajari
s/travail/glanding on hfr/gs;
Posté le 27-06-2006 à 16:38:13  profilanswer
 

Comment te l'explique très bien ton erreur, tu ne peux pas te servir de MIN,MAX, COUNT sans avoir un GROUP BY à la fin de ta requête.
Tu peux d'ailleurs lire la doc à ce sujet: http://dev.mysql.com/doc/refman/5. [...] tions.html
 
Dans ton cas il est necessaire que tu changes un peu ta requête car tu ne peux pas faire un group by "*", il va falloir que tu spécifies les champs sur lesquels tu souhaites grouper.
 
Enfin, la requête donnée par alien_nan ne réponds pas à la question puisqu'elle ne remonte que le 'count', count qui est également faux puisque s'il n'y a pas d'enregistrement qui vérifie la jointure elle remonte tout de même 1.

Message cité 1 fois
Message édité par anapajari le 27-06-2006 à 16:38:46
n°1395858
nORKy
Grmmph...
Posté le 27-06-2006 à 16:41:20  profilanswer
 

désolé, j'ai du mal à comprendre...
Car, je ne groupe pas sur groups.* mais sur aacls.group_id non ?
Je viens d'essayer ca :

Code :
  1. SELECT groups.*, COUNT(aacls.aacl_group_id) AS num_aacls
  2. FROM groups
  3. LEFT OUTER JOIN aacls ON aacls.aacl_group_id = groups.group_id
  4. WHERE entity_id='$entity_id' OR entity_id='0'
  5. GROUP BY aacls.aacl_group_id


 
Et apparement, ca fonctionnent, je vais faire + de test pour vérifier

n°1395864
alien_nan
Posté le 27-06-2006 à 16:48:06  profilanswer
 

anapajari a écrit :

Comment te l'explique très bien ton erreur, tu ne peux pas te servir de MIN,MAX, COUNT sans avoir un GROUP BY à la fin de ta requête.
Tu peux d'ailleurs lire la doc à ce sujet: http://dev.mysql.com/doc/refman/5. [...] tions.html

 

Dans ton cas il est necessaire que tu changes un peu ta requête car tu ne peux pas faire un group by "*", il va falloir que tu spécifies les champs sur lesquels tu souhaites grouper.

 

Enfin, la requête donnée par alien_nan ne réponds pas à la question puisqu'elle ne remonte que le 'count', count qui est également faux puisque s'il n'y a pas d'enregistrement qui vérifie la jointure elle remonte tout de même 1.

 


le nb d'acl correspond au nb de fois ou id_groups apparait (a moins que je n'ai pas compris)
par contre, ce serait peut etre mieux avec une jointure interne pour que la jointure soit forcement valide, non ?
 

n°1395865
anapajari
s/travail/glanding on hfr/gs;
Posté le 27-06-2006 à 16:49:46  profilanswer
 

relis l'exemple de la doc [:spamafote]

Code :
  1. mysql> SELECT student.student_name,COUNT(*)
  2.     ->        FROM student,course
  3.     ->        WHERE student.student_id=course.student_id
  4.     ->        GROUP BY student_name;


 
Le group by s'effectue sur toutes les colonnes sur lesquels tu n'appliques pas de "fonction".
 
edit:

alien_nan a écrit :

le nb d'acl correspond au nb de fois ou id_groups apparait (a moins que je n'ai pas compris)
par contre, ce serait peut etre mieux avec une jointure interne pour que la jointure soit forcement valide, non ?


Bouuh comment t'as tout changé ta requête ... honte à toi!!!
Je te rappele que tu avais fait un:

Code :
  1. select count(1) from ( select ...)


edit2: t'as pas l'air d'avoir changé ton post, j'en deduis donc que tu l'as effacé c'est encore pire :o

Message cité 1 fois
Message édité par anapajari le 27-06-2006 à 16:57:27
n°1395871
alien_nan
Posté le 27-06-2006 à 16:57:55  profilanswer
 

anapajari a écrit :

relis l'exemple de la doc  [:spamafote]

 

Le group by s'effectue sur toutes les colonnes sur lesquels tu n'appliques pas de "fonction".

 

edit:

 

Bouuh comment t'as tout changé ta requête ... honte à toi!!!
Je te rappele que tu avais fait un:
 

Code :
  1. select count(1) from ( select ...)


 
 

 

 
Je viens de relire, et je ne vois pas en quoi il y aura un souci. S'il fait une jointure interne, il n'aura que des élements valides, et le group by se fera sur les éléments issus  de la requete, jointure et where effectué avant ?

n°1395875
alien_nan
Posté le 27-06-2006 à 17:03:00  profilanswer
 


 
 
 
anapajari a écrit :

 


edit:

 

Bouuh comment t'as tout changé ta requête ... honte à toi!!!
Je te rappele que tu avais fait un:
 

Code :
  1. select count(1) from ( select ...)


edit2: t'as pas l'air d'avoir changé ton post, j'en deduis donc que tu l'as effacé c'est encore pire  :o
 
 

 


1° ) j'avais ecrit une erreur ds la premiere qui n'est pas lié au count(1)  :o  mais sur une requete fausse (que tu as repris) car j'avais lu trop vite. j'ai effacé car laisser une erreur en attendant que je corrige est certainement moins judicieux que de l'effacer....
2°) count(1) est plus performant que count(*) ou count(nom_d_un_cham_quelconque) et ce n'est pas une erreur (si c ce point que tu voulais remonter)
3°) je vois pas en quoi corriger une erreur est une honte ....

n°1395877
alien_nan
Posté le 27-06-2006 à 17:06:05  profilanswer
 

Citation :

 

Enfin, la requête donnée par alien_nan ne réponds pas à la question puisqu'elle ne remonte que le 'count', count qui est également faux puisque s'il n'y a pas d'enregistrement qui vérifie la jointure elle remonte tout de même 1.


euh...select count(1) from matable  ne remonte pas 1, hein  :o

n°1395886
anapajari
s/travail/glanding on hfr/gs;
Posté le 27-06-2006 à 17:16:35  profilanswer
 

alien_nan a écrit :


3°) je vois pas en quoi corriger une erreur est une honte ....


C'est pas une honte, c'est juste que je passe pour un taré à dire que ton truc est faux alors que le nouveau que tu as mis est juste ;)
 

alien_nan a écrit :

euh...select count(1) from matable  ne remonte pas 1, hein  :o


Dans ton exemple, le problème que je soulignais était le suivant:
Table A:

id
1
2
3


Table B:


name id
X    1
Z    2


ta requête était:

Code :
  1. select count(1) from (select A.* from A left outer join B on A.id = B.id)


Le count remonterait 1 pour chacun des enregistrements de la table A, alors qu'il n'y a pas d'enregistrement pour l'id 3

1
1
1


Par ailleurs, si tu as 2 enregistrements avec id = 1, ton count remonte 2 fois 1 au lieu de 1 fois 2 [:spamafote]

mood
Publicité
Posté le 27-06-2006 à 17:16:35  profilanswer
 

n°1395895
alien_nan
Posté le 27-06-2006 à 17:21:30  profilanswer
 

on est d'accord  :p  (et on ne t'a pas pris pour un taré, j'avais de toute facon faux sur le mode de jointure, et je crois que c'est toujours le cas)
 :hello:


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  jointure + count

 

Sujets relatifs
jointure mysqlutilisation de COUNT()
[SQL] select count(*)select count(*) + group by : les sortir en php
MySql et count()jointure et requete imbriquée?
problème de jointure avec deux tables avec mysqlproblème de jointure
Phpmyadmin et la jointure externe left joinProblème de count avec jointure
Plus de sujets relatifs à : jointure + count


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR