Jointure qui ne fonctionne pas

WRInaute occasionnel
Bonjour,
je suis en train de mettre ne place un mini forum sur mon site.

indépendement les données s'affichent bien :
requet pour affichage des sujets :
Code:
$req = mysql_query("SELECT id, auteur, titre, date_derniere_reponse FROM forum_sujets ORDER BY date_derniere_reponse DESC");

et requette pour affichage des messages :
Code:
	$sql = 'SELECT auteur, message, date_reponse FROM forum_reponses WHERE correspondance_sujet="'.$_GET['id_sujet_a_lire'].'" ORDER BY date_reponse ASC';

maintenant j'essai d'afficher sur la meme page a la foi le sujet et les messages mais je n'ai rien du tout qui s'affiche.
j'essai de faire une jointure mais je n'ai rien qui s'affiche.

Code:
$req = mysql_query("SELECT DISTINCT forum_sujets.id, auteur, titre, date_derniere_reponse FROM forum_sujets LEFT JOIN forum_reponses ON (forum_reponses.correspondance_sujet = forum_sujets.id);");

Voyez vous ou peut etre mon erreur ?
 
WRInaute impliqué
Code:
$req = mysql_query("SELECT DISTINCT t1.id, auteur, t1.titre, t1.date_derniere_reponse, t2.message FROM forum_sujets  AS t1,forum_reponses AS t2 
WHERE t2.correspondance_sujet = t1.id;");
Pourquoi vouloir faire une jointure?

Le LEFT JOIN sur une table 2 ne sert que si tu n'es pas sûr qu'elle renvoit une réponse, ou si elle en renvoit plusieurs.
Pour une correspondance exacte, voir plus haut :)
 
WRInaute occasionnel
Bonjour,
même en utilisant cette solution je n'ai aucunes données qui s'affichent.
j'ai repris telque ta requette, puis je l'ai modifié lais toujours rien aucunes données.
Code:
$req = mysql_query("SELECT DISTINCT forum_sujets.id, forum_sujets.auteur, forum_sujets.titre, forum_sujets.date_derniere_reponse, forum_reponses.message FROM forum_sujets AS forum_sujets.id,forum_reponses AS forum_reponses WHERE forum_reponses.correspondance_sujet = forum_sujets.id;");

avec left joint sa fonctionne en partie mais le probleme est que si il y a plusieurs réponses il m'affiche plusieur fois le titre de la table forumssujet avec un reponse a chaque fois en dessous ?
Code:
SELECT * FROM forum_sujets INNER JOIN forum_reponses ON forum_reponses.correspondance_sujet = forum_sujets.id
 
WRInaute accro
J'ai pas trop compris ce que tu voulais afficher et sous quelle form. Qu'est-ce que tu as comme données dans tes tables, on peut avoir quelques lignes de chaque ainsi que leur structure ?

Si tu veux juste afficher un titre et ses sujets bah oui une simple jointure suffit. Si ca suffit pas c'est qu'il y a un problème quelque part soit dans la structure des tables, soit au niveau des données. Tu peux aussi faire 2 requêtes séparément si tu n'as vraiment pas besoin des infos du sujet dans chaque réponse.
 
WRInaute impliqué
Et plus simplement sans distinct

Code:
SELECT 
    a.id AS id_sujet, 
    a.auteur AS id_auteur, 
    a.titre, 
    a.date_derniere_reponse,
    b.id,
    b.auteur, 
    b.message, 
    b.date_reponse

FROM
    forum_sujets a,
    forum_reponses b

WHERE
    a.id=b.correspondance_sujet

ORDER BY
    a.date_derniere_reponse DESC,
    b.date_reponse ASC
 
WRInaute impliqué
Tu aurais construit tes deux tables avec des libellés distinct la requête serait plus simple :

forum_sujets :
- id_forum_sujet
- id_auteur_sujet
- titre
- date_derniere_reponse

et
forum_reponses
- id_forum_reponses
- auteur_forum_reponses,
- message,
- date_reponse,
- id_forum_sujet

et la requête :
SELECT * FROM forum_sujets NATURAL JOINT forum_reponses ORDER BY date_derniere_reponse DESC, date_reponse ASC
 
WRInaute accro
Il dit qu'il a déjà essayé la simple jointure. Le natural join c'est un inner join caché hein ;)
 
WRInaute impliqué
Et alors? je lui donne des requêtes propres qui normalement donnent des résultats, si il en obtient pas, c'est que les tables sont soit mal remplies, soit mal conçues pour faire la jointure, et c'est pour cela que pour le natural j'ai donné une structure de table avec
 
WRInaute occasionnel
bon alors voilà mes 2 tables :

Code:
CREATE TABLE `forum_reponses` (
  `id` int(6) NOT NULL auto_increment,
  `auteur` varchar(30) collate latin1_german2_ci NOT NULL,
  `message` text collate latin1_german2_ci NOT NULL,
  `date_reponse` datetime NOT NULL default '0000-00-00 00:00:00',
  `correspondance_sujet` int(6) NOT NULL,
  PRIMARY KEY  (`id`)
) ;

CREATE TABLE `forum_sujets` (
  `id` int(6) NOT NULL auto_increment,
  `auteur` varchar(30) collate latin1_german2_ci NOT NULL,
  `titre` text collate latin1_german2_ci NOT NULL,
  `date_derniere_reponse` datetime NOT NULL default '0000-00-00 00:00:00',
  PRIMARY KEY  (`id`)
) ;

Et je veus donc afficher sur ma page :
l'auteur, le titre, la date de la derniere reponse et une partie du message.
quand je cliquerai sur une des titre (qui n'apparait qu'une seule fois) j'irai sur une autre page qui detailerra le message et ses reponses.
 
WRInaute accro
Tu parles d'un message(réponse) ou d'un message(topic) ? Encore pas clair :p


Bon je viens de tester avec tes tables, et ceci fonctionne. Ca te ramène Les derniers topics avec leur dernier message sur une ligne.

Code:
select s.*,r.* from forum_sujets s 
inner join forum_reponses r on (s.id = r.correspondance_sujet) 
where r.id = (select max(id) from forum_reponses where correspondance_sujet = s.id)
order by r.date_reponse desc

Tape ça dans phpMyAdmin pour voir ? Moi ca m'a donné :

Code:
id 	auteur 	titre 	date_derniere_reponse 	id 	auteur 	message 	date_reponse Décroissant 	correspondance_sujet
1 	monauteur 	montitre 	2011-05-18 00:00:00 	4 	qqsdqsd 	qsdqd 	2011-05-18 00:00:00 	1
2 	heheauteur 	hehetitre 	2010-05-25 00:00:00 	3 	qsqsd 	qsdqs 	2010-05-25 00:00:00 	2
 
WRInaute occasionnel
Super sa fonctionne. bon j'ai adapté mais c pareil (enfin je pense)

j'ai fais ceci (sa fait gros mais sa marche) :
Code:
$req = mysql_query("SELECT forum_sujets.id, forum_sujets.auteur, forum_sujets.titre, forum_sujets.date_derniere_reponse, forum_reponses.message, forum_reponses.correspondance_sujet FROM forum_sujets INNER JOIN forum_reponses ON (forum_reponses.correspondance_sujet = forum_sujets.id) group by forum_sujets.id order by forum_sujets.date_derniere_reponse desc,forum_reponses.date_reponse desc");
 
WRInaute accro
non ça marche pas ta requête, regarde bien les résultats seront pas corrects. Ca prendra pas le dernier message pour ton topic. Utilise la requête que j'ai mis avec le select max(id). Ca reste le mieux à faire.

Le problème avec ta requête c'est que Mysql va grouper avant de faire l'order by, donc tu n'auras pas forcément le dernier message pour chaque topic. Et met des alias "r" et "s" par exemple, c'est beaucoup plus clair :)
 
Discussions similaires
Haut