Requete de classement SQL sur trois tables avec SUM, COUNT..


nickargall
WRInaute accro
WRInaute accro
 
Messages: 6468
Inscription: 13 Juin 2005

Requete de classement SQL sur trois tables avec SUM, COUNT..

Message le Lun Aoû 04, 2008 22:27

Bonsoir à tous
Je suis pas fortiche en SQL et j'ai besoin de vos lumières.

J'ai, dans une table PRONO, les champs suivant qui m'intéressent :
| points | id_user |
5 1
5 1
10 2
50 2

Dans une table USER, les champs suivant :
id_user | pseudo
1 POPOL
2 LULU

Et une troisième table MESSAGES qui recense les messages postés sur mon forum par les membres :
j'y ai notamment les champs suivants :
id_message | nom ..
1 LULU
2 LULU
3 POPOL
4 LULU

Dans un premier temps, j'ai voulu sortir le classement des [user.nom] en fonction du total des [prono.points]. J'ai donc mis en place une requête SQL :
Code: Tout sélectionner
SELECT SUM(points), prono.id_user, user.pseudo FROM prono,user WHERE user.id_user=prono.id_user GROUP BY id_user ORDER BY SUM(points) DESC

et ca fonctionne très bien.

Maintenant la complication :

Je voudrais pouvoir également classer les [user.nom] en fonction du total des [prono.points] descendant ET du nombre total de [messages.id_message] qui lui correspondent.

J'ai donc "bêtement" tenté de rajouter un COUNT(messages.id_message) d'un coté et un WHERE messages.nom=user.pseudo de l'autre :

Code: Tout sélectionner
SELECT SUM(points), COUNT(messages.id_message), prono.id_user, user.pseudo FROM prono,user, messages  WHERE messages.nom=user.nom AND user.id_user=prono.id_user GROUP BY id_user ORDER BY SUM(points) DESC


Mais bon ca le fait pas du tout. Mon total de SUM(points) correspond pas du tout à ce que je voudrais, ni mon COUNT(id_message) non plus d'ailleurs.

D'ou ma question : avec les données indiquées ci dessus, comment obtenir un classement des user.pseudo selon la somme de points Descendante et le nombre de id_messages descendant ?

Merci à celui qui me dira : "C'est pas compliqué, essaie plutôt comme ça " :)


YoyoS
WRInaute accro
WRInaute accro
 
Messages: 3835
Inscription: 14 Sep 2006

Message le Lun Aoû 04, 2008 22:42

Salut, t'es sure que dans ta table MESSAGES il y a des noms et pas des id_user ?


nickargall
WRInaute accro
WRInaute accro
 
Messages: 6468
Inscription: 13 Juin 2005

Message le Lun Aoû 04, 2008 22:48

Ouaip, une coquille du mec qui a créé la base de données à l'origine :)

bon ok c'est moi, je l'avoue


YoyoS
WRInaute accro
WRInaute accro
 
Messages: 3835
Inscription: 14 Sep 2006

Message le Lun Aoû 04, 2008 23:06

Si je pouvais avoir le code exporté de la structure de tes tables et quelques données je me donnerais à cœur joie pour tester :D

La j'ai pu faire que ça mais il y a de grandes chances que ça ne marche pas :D

Code: Tout sélectionner
SELECT SUM(p.points) as pts,COUNT(m.*) as nbMess,p.id_user, u.nom
FROM prono p,user u,messages m
WHERE u.id_user = p.id_user AND u.nom = m.nom
GROUP BY p.id_user,u.nom
ORDER BY pts DESC,nbMess DESC;


Pas trop envie de réfléchir, donc si je pouvais tester :mrgreen:


nickargall
WRInaute accro
WRInaute accro
 
Messages: 6468
Inscription: 13 Juin 2005

Message le Lun Aoû 04, 2008 23:16

merci de l'essai ... non transformé :) Après quelques corrections, j'obtiens les mêmes résultats que la requête que j'ai tenté.
Code: Tout sélectionner
SELECT SUM( p.points ) AS pts, COUNT( m.id_message ) AS nbMess, p.id_user, u.pseudo
FROM prono p, user u, messages m
WHERE u.id_user = p.id_user
AND u.pseudo = m.nom
GROUP BY p.id_user, u.nom
ORDER BY pts DESC , nbMess DESC


mais merci d'avoir essayé :)

oxado
Nouveau WRInaute
Nouveau WRInaute
 
Messages: 35
Inscription: 24 Nov 2005

Message le Lun Aoû 04, 2008 23:22

Quelque chose comme:

Code: Tout sélectionner
select sum_points,count_messages,id_user,user_pseudo from (SELECT SUM(points) as sum_points, prono.id_user, user.pseudo AS user_pseudo FROM prono,user WHERE user.id_user=prono.id_user GROUP BY id_user) s1,(SELECT messages.nom,count(*), prono.id_user FROM messages GROUP BY nom) s2 WHERE user_pseudo=nom


non?

Jacques.


YoyoS
WRInaute accro
WRInaute accro
 
Messages: 3835
Inscription: 14 Sep 2006

Message le Lun Aoû 04, 2008 23:26

Moi j'ai envie de tester en ligne, pas de jouer aux devinettes :D


nickargall
WRInaute accro
WRInaute accro
 
Messages: 6468
Inscription: 13 Juin 2005

Message le Lun Aoû 04, 2008 23:42

@jacques :
MySQL a répondu:
#1054 - Unknown column 'prono.id_user' in 'field list'

@Yoyos : ma structure de table t'arrive par email :)

Merci de vos tentatives à tous les deux


nickargall
WRInaute accro
WRInaute accro
 
Messages: 6468
Inscription: 13 Juin 2005

Message le Lun Aoû 04, 2008 23:57

oui mais non en fait j'ai rien dit, yoyos a supprimé un message :)
Dernière édition par nickargall le Mar Aoû 05, 2008 0:00, édité 2 fois.


YoyoS
WRInaute accro
WRInaute accro
 
Messages: 3835
Inscription: 14 Sep 2006

Message le Lun Aoû 04, 2008 23:57

Teste moi ça, c'est dlabonne ;o

Code: Tout sélectionner
SELECT SUM(p.points) as pts, p.id_user, u.pseudo,
  (SELECT COUNT(*)
   FROM messages m
   WHERE m.nom = u.nom) as nbMess
FROM prono p,user u
WHERE u.id_user = p.id_user
GROUP BY u.id_user
ORDER BY pts DESC,nbMess DESC


A oui, j'avais supprimé ma réponse, je me suis vite rendu compte que ce n'était pas les bons résultats :)


nickargall
WRInaute accro
WRInaute accro
 
Messages: 6468
Inscription: 13 Juin 2005

Message le Mar Aoû 05, 2008 0:00

YoyoS a écrit:Teste moi ça, c'est dlabonne ;o

Code: Tout sélectionner
SELECT SUM(p.points) as pts, p.id_user, u.pseudo,
  (SELECT COUNT(*)
   FROM messages m
   WHERE m.nom = u.nom) as nbMess
FROM prono p,user u
WHERE u.id_user = p.id_user
GROUP BY u.id_user
ORDER BY pts DESC,nbMess DESC


A oui, j'avais supprimé ma réponse, je me suis vite rendu compte que ce n'était pas les bons résultats :)



Aaaaah merci :) Voilà une requete qu'elle est bonne :) Impeccable :)

J'aurais appris qu'on peut faire ça :
Code: Tout sélectionner
...  (SELECT COUNT(*)
   FROM messages m
   WHERE m.nom = u.nom) as nbMess ...

J'me coucherai moins bête ce soir :) Merci a tous et spéciale dédicace à Yoyos (comme disent les djeunes des forums) :)


YoyoS
WRInaute accro
WRInaute accro
 
Messages: 3835
Inscription: 14 Sep 2006

Message le Mar Aoû 05, 2008 0:01

Mais 2 rien, ça fera un BL mon cher :mrgreen: Oue on est pas encore taxé sur le bl j'en profite :D


nickargall
WRInaute accro
WRInaute accro
 
Messages: 6468
Inscription: 13 Juin 2005

Message le Mar Aoû 05, 2008 0:05

Tu crois qu'un BL émanant d'un site sur le foot aidera ton positionnement sur la thématique des tutoriels totoshop ? :)


YoyoS
WRInaute accro
WRInaute accro
 
Messages: 3835
Inscription: 14 Sep 2006

Message le Mar Aoû 05, 2008 0:07

Ce qui est sure c'est que ça ne peut pas le faire plonger :D Attend, je vais faire un tuto pour créer un ballon de foot :mrgreen:


nickargall
WRInaute accro
WRInaute accro
 
Messages: 6468
Inscription: 13 Juin 2005

Message le Mar Aoû 05, 2008 0:37

Euh en fait ca marche pas a 100%. Il me donne 0 pour le nbMess de id_ser qui devraient en avoir.Fichtre.
Edit : Bon j'ai trouvé l'"erreur" qui se glissait dans la requete que tu proposais. c'était juste au niveau de la requete imbriquée :

(SELECT COUNT(*)
FROM messages m
WHERE m.nom = u.pseudo) as nbMess

au lieu de

(SELECT COUNT(*)
FROM messages m
WHERE m.nom = u.nom) as nbMess

Requete de classement SQL sur trois tables avec SUM, COUNT..

Si vous avez aimé cette discussion, partagez-la sur vos réseaux sociaux préférés :

Lectures recommandées sur ce thème :



Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité