jointure + count

jointure + count - SQL/NoSQL - Programmation

Marsh Posté le 27-06-2006 à 16:26:00    

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 ?

Reply

Marsh Posté le 27-06-2006 à 16:26:00   

Reply

Marsh Posté le 27-06-2006 à 16:36:48    

 

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

 

Reply

Marsh Posté le 27-06-2006 à 16:38:13    

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
Reply

Marsh Posté le 27-06-2006 à 16:41:20    

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

Reply

Marsh Posté le 27-06-2006 à 16:48:06    

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 ?
 

Reply

Marsh Posté le 27-06-2006 à 16:49:46    

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
Reply

Marsh Posté le 27-06-2006 à 16:57:55    

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 ?

Reply

Marsh Posté le 27-06-2006 à 17:03:00    


 
 
 
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 ....

Reply

Marsh Posté le 27-06-2006 à 17:06:05    

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

Reply

Marsh Posté le 27-06-2006 à 17:16:35    

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]

Reply

Marsh Posté le 27-06-2006 à 17:16:35   

Reply

Marsh Posté le 27-06-2006 à 17:21:30    

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:

Reply

Sujets relatifs:

Leave a Replay

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