[PHP/MySQL] Probleme de Requete - Regroupement & Order by

Bonjour,

J’ai un problème pour une réquete, en gros c’est pour le développement d’un Forum.

Voici mes 3 tables concernés:


CREATE TABLE `topic` (
  `idTopic` int(11) NOT NULL auto_increment,
  `TitreTopic` text NOT NULL,
  `idForum` int(11) NOT NULL default '0',
  PRIMARY KEY  (`idTopic`)
)

CREATE TABLE `post` (
  `idPost` int(11) NOT NULL auto_increment,
  `MessagePost` text NOT NULL,
  `DatePost` datetime NOT NULL default '0000-00-00 00:00:00',
  `idUser` int(11) NOT NULL default '0',
  `idTopic` int(11) NOT NULL default '0',
  PRIMARY KEY  (`idPost`)
)

CREATE TABLE `user` (
  `idUser` int(11) NOT NULL auto_increment,
  `LoginUser` varchar(15) NOT NULL default '',
  `PasswordUser` varchar(32) NOT NULL default '',
  `DateNaissanceUser` date NOT NULL default '0000-00-00',
  `TypeUser` varchar(15) NOT NULL default '',
  `DateInscriptionUser` date NOT NULL default '0000-00-00',
  `PaysUser` varchar(30) NOT NULL default '',
  PRIMARY KEY  (`idUser`)
)

Et voici ma requete :


$query_topic = 'Select Topic.idTopic, TitreTopic, DatePost, LoginUser';
      $query_topic .= ' From Topic, Post, User';
      $query_topic .= ' Where Topic.idTopic = Post.idTopic';
      $query_topic .= ' And User.idUser = Post.idUser';
      $query_topic .= ' And idForum =' . $_GET['id'];
      $query_topic .= ' Group by Topic.idTopic, TitreTopic';
      $query_topic .= ' Order by DatePost DESC';

Ce que je voudrais c’est afficher la liste des Topic d’un Forum, avec le Pseudo et la date de derniers post dans le topic concerné.

Ma requete me liste bien les topic, mais affiche seulement le pseudo et l’heure du premier post.

Résultat:

Le resultat n’est dont pas correct, vu que le dernier posteur n’est pas ‘TwiSter’ pour les 2 topics

Si quelqu’un pourrait m’aider pour ça, ça serait bien ^^
Merci d’avance !

Pour commencer :

$query_topic = 'Select Topic.idTopic, TitreTopic, DatePost, LoginUser';
     $query_topic .= ' From Topic, Post, User';
     $query_topic .= ' Where Topic.idTopic = Post.idTopic';
     $query_topic .= ' And User.idUser = Post.idUser';
     $query_topic .= ' And idForum =' . $_GET['id'];
     $query_topic .= ' Group by Topic.idTopic, TitreTopic';
     $query_topic .= ' Order by DatePost DESC';

BIRK.

$query_topic = 
'SELECT T.idTopic, TitreTopic, DatePost, LoginUser
FROM Topic T, Post P, User U
INNER JOIN Post P ON T.idTopic = P.idTopic
INNER JOIN User U ON U.idUser = P.idUser
WHERE idForum =' . (int)$_GET['id'] . '
GROUP BY T.idTopic, TitreTopic
ORDER BY DatePost DESC';

MIEUX ! (donc je résume : majuscule pour différencier les mots clefs, injection SQL (le get), jointure dans la clause WHERE, alias, utilisation des sauts de ligne dans la chaîne (ce qui est un des réels plus de php par rapport à C/Java, etc))

Pour ton problème :

Personnellement, je ne suis pas pour ce genre de calcul, surtout sur un forum. Imagines que tu ais genre 50.000 topics, et 5 fois plus de messages, et 5000 utilisateurs :

Rien que pour le dernier posteur, et la date du dernier post, tu vas obligatoirement faire deux jointures, qui ne sont pas les plus légères (ta table Post n’est pas de taille fixe, idem pour Topic).

Une solution qui est tout sauf Modèle Relationnel (à cause de la redondance) c’est de stocker dans ta table Topic la date du dernier message, et son auteur : tu réduis ainsi à une jointure avec la table user, et tu résoud ton problème.

Sinon, sans être spécialiste, je dirais que la solution propre consiste à faire une requête imbriquée (je ne sais pas s’il est possible de faire MAX sur un couple)

Merci pour ta réponse ^^
Pour la requête SQL, notre professeur nous l’avait appris comme ça et puis personnellement j’aime pas trop les Inner Join :confused:

En ce qui concerne le forum, ça serait une mini activité pour l’oral de mon examen. Donc avec une redondance de données je sais pas si ça va bien passé.
J’ai testé avec une sous requête et un MAX dedans mais rien de bon.
J’ai surement mal fait ma requête, tu pourrais me montrer avec la sous requête stp ?
Et puis a la présentation de l’activité, il y aura grand maximun 100 post et une dizaine de topic, la rapidité n’est pas un problème.
Si vraiment rien marche, je ferai ta méthode en mettant le nom et la date du dernier post dans la table topic :slight_smile:

Pour la sous requête je sais pas :slight_smile:

(en plus ça dépend du SGBD (mySQL ? MSSQL? etc))

C’est sous MySQL.

Bon y a pas un fortiche qui s’y connait vachement en SQL ici ? ^^

Sinon j’ai tenter de faire le listing en 2 requête avec :

  1. Affichage des noms de topic
  2. Affichage des derniers posteurs

Ca marche mais pas comme je voudrai. En fait il affiche bien les derniers posteurs pour chaque topic, mais pour le listing des topics il fait toujours l’order by sur la date du premier post. Ce qui fait que lorsqu’on post un message sur “vieux” forum, il reste en bas :confused:

Siouplait j’ai besoin d’aide :confused:

Puisque tu utilises php tu peux le faire avec.