Page 1 sur 2

Jointure multiple 3 tables + trier par order count()... dur!

Posté : 09 juin 2007, 23:43
par cfiles
Bonjour tout le monde,

Je reviens faire un tour par ici pour trouver des réponses à mon problème, mais malheureusement, je n'ai pas trouvé... alors peut-être qu'une âme charitable viendra à mon aide (encore une fois...:p) parce que je m'arrache les cheveux ! :?
J'ai 3 tables :
newscomments : qui enregistre les commentaires des membres (commentaire, idmembre et login)
photos_comments : idem mais commentaires sur les photos
membres : liste des membres.

Je voudrais faire des petites stats et classer par ordre décroissant les meilleurs commentateurs (news + pics).

J'ai tout essayé, mais les résultats sont faux... Voilà la piste que je suis :
SELECT COUNT(newscomments.idauteur) AS news, COUNT(photos_comments.idmembrepc) AS pics, membres.idmembre AS id, membres.loginmembre AS login
FROM newscomments, photos_comments, membres
GROUP BY id
ORDER BY (
news + pics
) DESC
Merci de votre aide si vous avez compris... Sachant que idauteur = idmembrepc = idmembre sur les différentes tables...
Quand je fais la requête ça me répond :
#1054 - Unknown column 'news' in 'order clause' 
Et si je mets juste order by news (ou pics), ça marche mais les résultats sont archifaux...

Merci,
Caro.

Posté : 09 juin 2007, 23:45
par fab
essaye :

SELECT COUNT(newscomments.idauteur) AS news, COUNT(photos_comments.idmembrepc) AS pics, membres.idmembre AS id, membres.loginmembre AS login
FROM newscomments, photos_comments, membres
GROUP BY id
ORDER BY
news,pics
DESC

Posté : 09 juin 2007, 23:49
par cfiles
Bonsoir et merci Fab,

Ca marche un peu mieux en effet, mais les résultats sont toujours complètement erronés (et je ne comprends pas d'où ils viennent !!). Par exemple dans news, il me sort 11875 (commentaires !!!) pour le 1er alors qu'au max, le plus de commentaires est de 97...
J'ai essayé de le modifié en rajoutant plutôt :
GROUP BY newscomments.idauteur, photos_comments.idmembrepc, id
mais c'est toujours faux...
Est-il possible dans la requête de dire que ces 3 entités sont les mêmes ? (pour que le résultat soit sur la même ligne et sachant qu'ils ne sont pas forcément tous présents dans les 3) ??

Posté : 10 juin 2007, 00:12
par Sékiltoyai
Tu t'es trompé dans la requète, tu ne vérifies pas que idauteur et idmembrepc correspond à id.
Je te propose ceci :

Code : Tout sélectionner

SELECT COUNT(newscomments.idauteur) AS news, COUNT(photos_comments.idmembrepc) AS pics, membres.idmembre AS id, membres.loginmembre AS login, news+pics AS ordre FROM membres JOIN newscomments ON newscomments.idauteur=membres.idmembre JOIN photos_comments ON photos_comments.idmembrepc=membres.idmembre GROUP BY id ORDER BY ordre, id DESC

Posté : 10 juin 2007, 00:40
par Hubert Roksor
Et puis au passage il faudrait indiquer de quelles tables proviennent ces colonnes... notamment "GROUP BY id".

Posté : 10 juin 2007, 01:19
par iclo
Juste pour ajouter un petit complément théorique (vu que la cause du dernier problème a été visiblement trouvé):
Quand on débugge des select sur plusieurs tables et qu'on obtient un nombre de résultats énorme par rapport à ce qui se trouve dans les tables, c'est très probablement parce qu'il manque une jointure entre deux table (table1.id = table2.id_table1) et qu'on obtient donc un produit carthésien

C'est également une bonne raison pour tester ses scripts sur des tables contenant un nombre raisonnable de données, faire un produit carthésien sur une base de donnée en production contenant quelques centaines de milliers d'enregistrement, peut faire "gros bobos" au serveur.

Posté : 10 juin 2007, 01:58
par Sékiltoyai
Et puis au passage il faudrait indiquer de quelles tables proviennent ces colonnes... notamment "GROUP BY id".
id, c'est un alias, apparement.

Posté : 10 juin 2007, 04:55
par Hubert Roksor
id, c'est un alias, apparement.
Ah oui tiens, au temps pour moi.

Posté : 10 juin 2007, 12:59
par cfiles
Merci Sékiltoyai pour ta correction, ça parrait en effet plus juste mais il me répond toujours (comme à chaque fois que je cherche à faire news+pics) :
#1054 - Unknown column 'news' in 'field list' 
Snif !

J'ai essayé de changer aussi, ne pas faire un order by ordre mais par pics ou news, les résultats sont énormes encore... Alors j'ai regardé par rapport à ce qu'a dit iclo, mais je ne vois toujours pas... !

Posté : 10 juin 2007, 13:15
par Sékiltoyai
C'est bizarre qu'il ne connaisse pas news et qu'il connaisse pics...
Tu peux me dire ce que tu as comme noms de colonnes dans tes tables ?

Posté : 10 juin 2007, 13:19
par cfiles
Voilà la structure des tables :

CREATE TABLE `membres` (
  `idmembre` int(11) NOT NULL auto_increment,
  `nommembre` varchar(50) NOT NULL default '',
  `prenommembre` varchar(50) NOT NULL default '',
  `bdaymembre` date default NULL,
  `loginmembre` varchar(50) NOT NULL default '',
  `mdpmembre` varchar(50) NOT NULL default '',
  `mailmembre` varchar(50) NOT NULL default '',
  `urlmembre` varchar(100) default NULL,
  `urlpubmembre` char(1) default NULL,
  `inscrmembre` datetime NOT NULL default '0000-00-00 00:00:00',
  `statutmembre` varchar(10) NOT NULL default 'nouveau',
  `lastconnect` datetime default NULL,
  `deconnect` datetime default NULL,
  `verylcon` datetime default NULL,
  PRIMARY KEY  (`idmembre`),
  UNIQUE KEY `loginmembre` (`loginmembre`),
  UNIQUE KEY `mailmembre` (`mdpmembre`)
) ;

CREATE TABLE `newscomments` (
  `idcomment` int(5) NOT NULL auto_increment,
  `idnews` int(5) NOT NULL default '0',
  `datecomment` datetime NOT NULL default '0000-00-00 00:00:00',
  `auteurcomment` varchar(55) NOT NULL default '',
  `idauteur` int(11) default NULL,
  `loginauteur` varchar(50) default NULL,
  `mailreponse` varchar(50) default NULL,
  `corpscomment` text NOT NULL,
  PRIMARY KEY  (`idcomment`)
) ;

CREATE TABLE `photos_comments` (
  `idpc` int(11) NOT NULL auto_increment,
  `nompicpc` varchar(50) NOT NULL default '0',
  `signpc` varchar(50) NOT NULL default '',
  `idmembrepc` int(11) NOT NULL default '0',
  `loginmembrepc` varchar(50) NOT NULL default '',
  `commpc` text NOT NULL,
  `datepc` datetime NOT NULL default '0000-00-00 00:00:00',
  PRIMARY KEY  (`idpc`)
) ;

Posté : 10 juin 2007, 16:23
par Hubert Roksor
C'est bizarre qu'il ne connaisse pas news et qu'il connaisse pics...
En fait peut-être qu'il ne connait pas "pics" non plus mais qu'il s'arrête à la première colonne inconnue. Je ne suis pas sûr qu'on puisse utiliser d'aliases dans une expression dans la clause SELECT, réessayez avec l'expression complète pour voir ?

Code : Tout sélectionner

SELECT COUNT(newscomments.idauteur) + COUNT(photos_comments.idmembrepc) AS ordre FROM ... ORDER BY order DESC

Posté : 10 juin 2007, 17:12
par fab
Soit c'est moi qui débloque soit tu as pas mis de clause WHERE donc en fait tu fais un COUNT sur toute ta table

Posté : 10 juin 2007, 19:03
par Sékiltoyai
Soit c'est moi qui débloque soit tu as pas mis de clause WHERE donc en fait tu fais un COUNT sur toute ta table
Je lui ai indiqué d'utiliser un JOIN ... ON ... dans sa requète.

Posté : 10 juin 2007, 21:09
par fab
Soit c'est moi qui débloque soit tu as pas mis de clause WHERE donc en fait tu fais un COUNT sur toute ta table
Je lui ai indiqué d'utiliser un JOIN ... ON ... dans sa requète.
Désolé j'avais pas vu :)