par
supercanard » 21 sept. 2008, 23:11
Bonsoir,
Je ne sais pas comment je vais expliquer ça, mais on va essayer
En gros je suis en train de faire un forum. Pour lister les topics j'ai besoin de récupérer le sujet, la date de création, l'auteur et la date du dernier message. Cette liste doit être classé par dâte de message.
Le tout avec 3 tables dont voici la structure :
Code : Tout sélectionner
CREATE TABLE IF NOT EXISTS `membre` (
`id_membre` int(11) NOT NULL auto_increment,
`email` varchar(200) collate utf8_bin NOT NULL,
`pseudo` varchar(200) collate utf8_bin NOT NULL,
`pwd` varchar(10) collate utf8_bin NOT NULL,
`admin` tinyint(1) NOT NULL,
PRIMARY KEY (`id_membre`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
CREATE TABLE IF NOT EXISTS `post` (
`id_post` int(11) NOT NULL auto_increment,
`id_topic` int(11) NOT NULL,
`id_membre` int(11) NOT NULL,
`date` datetime NOT NULL,
`message` text collate utf8_bin NOT NULL,
PRIMARY KEY (`id_post`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
CREATE TABLE IF NOT EXISTS `topic` (
`id_topic` int(11) NOT NULL auto_increment,
`id_membre` int(11) NOT NULL,
`nom` varchar(200) collate utf8_bin NOT NULL,
`date` datetime NOT NULL,
PRIMARY KEY (`id_topic`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
Alors étant un novice dans les jointures voici ce que j'ai fait :
SELECT topic . * , pseudo, post.date AS lastReply, post.id_post
FROM topic
LEFT JOIN membre ON membre.id_membre = topic.id_membre
LEFT JOIN post ON post.id_topic = topic.id_topic
GROUP BY topic.id_topic
ORDER BY post.date DESC
C'est là ou ça se corse pour expliquer le problème. En gros en faisant un test je me rend compte que la dâte de dernière réponse ( lastReply ) n'est pas la bonne. Du coup l'ordre est mauvais.
Si j'enlève group by le problème disparait mais je me retrouve avec une même ligne répétée à chaque fois qu'il y a un message, ce n'est donc pas le but.
J'espère que vosu me suivez, ce n'est pas évident à expliquer comme ça

Bonsoir,
Je ne sais pas comment je vais expliquer ça, mais on va essayer :D
En gros je suis en train de faire un forum. Pour lister les topics j'ai besoin de récupérer le sujet, la date de création, l'auteur et la date du dernier message. Cette liste doit être classé par dâte de message.
Le tout avec 3 tables dont voici la structure :
[code]
CREATE TABLE IF NOT EXISTS `membre` (
`id_membre` int(11) NOT NULL auto_increment,
`email` varchar(200) collate utf8_bin NOT NULL,
`pseudo` varchar(200) collate utf8_bin NOT NULL,
`pwd` varchar(10) collate utf8_bin NOT NULL,
`admin` tinyint(1) NOT NULL,
PRIMARY KEY (`id_membre`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
CREATE TABLE IF NOT EXISTS `post` (
`id_post` int(11) NOT NULL auto_increment,
`id_topic` int(11) NOT NULL,
`id_membre` int(11) NOT NULL,
`date` datetime NOT NULL,
`message` text collate utf8_bin NOT NULL,
PRIMARY KEY (`id_post`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
CREATE TABLE IF NOT EXISTS `topic` (
`id_topic` int(11) NOT NULL auto_increment,
`id_membre` int(11) NOT NULL,
`nom` varchar(200) collate utf8_bin NOT NULL,
`date` datetime NOT NULL,
PRIMARY KEY (`id_topic`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
[/code]
Alors étant un novice dans les jointures voici ce que j'ai fait :
[php]
SELECT topic . * , pseudo, post.date AS lastReply, post.id_post
FROM topic
LEFT JOIN membre ON membre.id_membre = topic.id_membre
LEFT JOIN post ON post.id_topic = topic.id_topic
GROUP BY topic.id_topic
ORDER BY post.date DESC
[/php]
C'est là ou ça se corse pour expliquer le problème. En gros en faisant un test je me rend compte que la dâte de dernière réponse ( lastReply ) n'est pas la bonne. Du coup l'ordre est mauvais.
Si j'enlève group by le problème disparait mais je me retrouve avec une même ligne répétée à chaque fois qu'il y a un message, ce n'est donc pas le but.
J'espère que vosu me suivez, ce n'est pas évident à expliquer comme ça ;)