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

Eléphanteau du PHP | 31 Messages

09 juin 2007, 23:43

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.
Modifié en dernier par cfiles le 10 juin 2007, 00:02, modifié 1 fois.

ViPHP
fab
ViPHP | 2657 Messages

09 juin 2007, 23:45

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
Seul l'intelligent a le pouvoir de se trouver con
try { work(); } catch(FlemmeExeption $e) { sleep(84600); }

Eléphanteau du PHP | 31 Messages

09 juin 2007, 23:49

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) ??

ViPHP
ViPHP | 5924 Messages

10 juin 2007, 00:12

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

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

10 juin 2007, 00:40

Et puis au passage il faudrait indiquer de quelles tables proviennent ces colonnes... notamment "GROUP BY id".

ViPHP
ViPHP | 2144 Messages

10 juin 2007, 01:19

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.

ViPHP
ViPHP | 5924 Messages

10 juin 2007, 01:58

Et puis au passage il faudrait indiquer de quelles tables proviennent ces colonnes... notamment "GROUP BY id".
id, c'est un alias, apparement.

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

10 juin 2007, 04:55

id, c'est un alias, apparement.
Ah oui tiens, au temps pour moi.

Eléphanteau du PHP | 31 Messages

10 juin 2007, 12:59

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

ViPHP
ViPHP | 5924 Messages

10 juin 2007, 13:15

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 ?

Eléphanteau du PHP | 31 Messages

10 juin 2007, 13:19

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`)
) ;

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

10 juin 2007, 16:23

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

ViPHP
fab
ViPHP | 2657 Messages

10 juin 2007, 17:12

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
Seul l'intelligent a le pouvoir de se trouver con
try { work(); } catch(FlemmeExeption $e) { sleep(84600); }

ViPHP
ViPHP | 5924 Messages

10 juin 2007, 19:03

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.

ViPHP
fab
ViPHP | 2657 Messages

10 juin 2007, 21:09

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 :)
Seul l'intelligent a le pouvoir de se trouver con
try { work(); } catch(FlemmeExeption $e) { sleep(84600); }