SQL, Jointure

Consultez la formation au référencement naturel Google de WebRankInfo / Ranking Metrics


Bahanix
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 131
Inscription: Mar Juin 07, 2005 23:58

SQL, Jointure

Message le Sam Oct 07, 2006 12:27

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


david96
WRInaute accro
WRInaute accro
 
Messages: 1407
Inscription: Dim Aoû 28, 2005 21:56

Message le Sam Oct 07, 2006 23:46

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


Bahanix
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 131
Inscription: Mar Juin 07, 2005 23:58

Message le Dim Oct 08, 2006 16:36

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


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