SQL, Jointure

WRInaute discret
Bonjour,

Je suis en train de créer un forum, mais j'ai un petit soucis avec les jointures :oops:

J'ai une table "user", "forum", une "topic", et une 4ième "message"

Le but est d'afficher la liste des topics en indiquant titre, date de création et créateur, ainsi que la date du dernier message et du posteur.

La table topic est structurée ainsi : id (du topic), user (id correspondant à la table "user"), dh (dateheure de création), nom.

La table message utilise aussi l'id de l'user, et il y a un attribut "topic" qui contient l'id du topic auquel il appartient.

Voici ma requete :
SELECT `topic`.*, COUNT(`message`.`id`) AS `nb`, MAX(`message`.`dh`) AS `mlastdh`, `user`.`pseudo` AS `lastuserpseudo`
FROM `topic`
LEFT JOIN `message` ON `topic`.`id`=`message`.`topic`
LEFT JOIN `user` ON `user`.`id`=`message`.`lastuser`
WHERE `topic`.`forum`=$forum
GROUP BY `topic`.`id`
ORDER BY `mlastdh` DESC

Plusieurs problèmes apparaissent : j'ai pas réussis a obtenir le pseudo du créateur du topic (topic.user) en même temps que le pseudo du dernier posteur, et là, le pseudo du dernier posteur (lastuserpseudo) m'affiche celui du créateur... "mlastdh" correspond à la date d'envois du dernier message du topic...

Quelqu'un aurait-il une solution ^^ ?
 
WRInaute passionné
Bon n'ayant pas la structure de tes champs et le pourquoi du comment de ta requête, tente pour un début simplement cette chtite requête pour vérifier tes jointures (je suppose que ce sont tous des clefs INT )

Code:
SELECT * FROM topic T
JOIN message M, user U
ON T.id=M.topic
AND U.id=M.lastuser

Bref là on vérifie si dans la table `topic` l'id est le même que dans la table `message` via son champ `topic`. Pour la table `user` idem mais dans le champ `lastuser` de la table `message`... Pour la table `forum`, j'en sais rien puisque tu ne nous mets pas de clefs étrangères.
 
WRInaute discret
Les jointures isolées sont bonnes, j'ai fait les tests, voici les structures des tables :

forum :
id
nom

topic :
id
forum (=forum.id)
dh (=date de création)
user (=créateur=user.id)
nom

message :
id
topic (=topic.id)
dh (=date de post)
user (=créateur du post=user.id)
message
lastuser (=dernier éditeur=user.id)
lastdh (=date de dernière édition)

user :
id
pseudo

En gras : nom des tables
En souligné : clés primaires
En italique : clés étrangères

Pour le fonctionnement théorique de la requête (dont le but est de fournir une liste de topic) :
SELECT `topic`.*, COUNT(`message`.`id`) AS `nb`, MAX(`message`.`dh`) AS `mlastdh`, `user`.`pseudo` AS `lastuserpseudo`
FROM `topic`
LEFT JOIN `message` ON `topic`.`id`=`message`.`topic`
LEFT JOIN `user` ON `user`.`id`=`message`.`lastuser`
WHERE `topic`.`forum`=$forum
GROUP BY `topic`.`id`
ORDER BY `mlastdh` DESC

On selectionne tout des topics (nom, date de création, id du créateur), ainsi que le nombre de messages dans chacun d'entre eux, la date du dernier post (le MAX est temporaire, logiquement en résolvant le probleme du pseudo ça sera bon pour lui aussi), ainsi que le pseudo du dernier posteur.

Pour cela, je joins a la table message les pseudos des user (dont on a que l'id de base), et les messages sont eux-même joins aux topic (pour en avoir le nombre). La seule condition étant d'être dans le bon forum, le tout trié par ordre décroissant de date de post, ce qi a logiquement pour effet de trier les topics (le 1er est celui qui possède le dernier post), et le pseudo du dernier posteur.

J'aimerais en plus récupérer le pseudo du créateur du topic, mais si cette requete fonctionnait, ce serait déjà pas mal XD
 
Discussions similaires
Haut