SQL, Jointure
3 messages • Page 1 sur 1
Consultez la formation au référencement naturel Google de WebRankInfo / Ranking Metrics
SQL, Jointure
Bonjour,
Je suis en train de créer un forum, mais j'ai un petit soucis avec les jointures
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 :
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 ^^ ?
Je suis en train de créer un forum, mais j'ai un petit soucis avec les jointures
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 ^^ ?
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 )
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.
- Code: Tout sélectionner
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.
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
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
3 messages • Page 1 sur 1
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 :
Qui est en ligne
Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 0 invités




le forum