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

Consultez la formation au référencement naturel Google de WebRankInfo / Ranking Metrics


nickargall
WRInaute accro
WRInaute accro
 
Messages: 5610
Inscription: Lun Juin 13, 2005 14:13

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: 3062
Inscription: Jeu Sep 14, 2006 4:53

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: 5610
Inscription: Lun Juin 13, 2005 14:13

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: 3062
Inscription: Jeu Sep 14, 2006 4:53

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: 5610
Inscription: Lun Juin 13, 2005 14:13

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
 
Messages: 35
Inscription: Jeu Nov 24, 2005 12:44

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: 3062
Inscription: Jeu Sep 14, 2006 4:53

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: 5610
Inscription: Lun Juin 13, 2005 14:13

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: 5610
Inscription: Lun Juin 13, 2005 14:13

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: 3062
Inscription: Jeu Sep 14, 2006 4:53

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: 5610
Inscription: Lun Juin 13, 2005 14:13

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: 3062
Inscription: Jeu Sep 14, 2006 4:53

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: 5610
Inscription: Lun Juin 13, 2005 14:13

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: 3062
Inscription: Jeu Sep 14, 2006 4:53

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: 5610
Inscription: Lun Juin 13, 2005 14:13

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

Formation recommandée sur ce thème :

Formation Référencement naturel Google : apprenez une méthode efficace pour optimiser à fond le référencement naturel dans Google de façon durable... Formation animée par Olivier Duffez et Fabien Facériès, experts en référencement naturel.

Tous les détails sur le site Ranking Metrics : programme, prix, dates et lieux, inscription en ligne.

Lectures recommandées sur ce thème :

Consultez la description détaillée des produits ou services de Google suivants : Google Suggest

  • Analyser le positionnement d'un site
    AgentWebRanking est un logiciel professionnel qui permet d'analyser le positionnement d'un ou plusieurs sites dans plus de 300 moteurs de recherche dans le monde. Vous pouvez ainsi analyser les performances du référencement pour de nombreux mots-clés.


Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 0 invités