Jointure qui ne fonctionne pas

fabrice88
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 289
Inscription: 15 Oct 2007

Jointure qui ne fonctionne pas

Message le Dim Mai 23, 2010 21:14

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: Tout sélectionner
$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: Tout sélectionner
   $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: Tout sélectionner
$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 ?


Dr DLP
WRInaute impliqué
WRInaute impliqué
 
Messages: 673
Inscription: 28 Juin 2003

Re: Jointure qui ne fonctionne pas

Message le Dim Mai 23, 2010 23:16

Code: Tout sélectionner
$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 :)

fabrice88
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 289
Inscription: 15 Oct 2007

Re: Jointure qui ne fonctionne pas

Message le Lun Mai 24, 2010 8:22

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: Tout sélectionner
$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: Tout sélectionner
SELECT * FROM forum_sujets INNER JOIN forum_reponses ON forum_reponses.correspondance_sujet = forum_sujets.id


YoyoS
WRInaute accro
WRInaute accro
 
Messages: 3835
Inscription: 14 Sep 2006

Re: Jointure qui ne fonctionne pas

Message le Lun Mai 24, 2010 10:42

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.

DadouDuck
WRInaute impliqué
WRInaute impliqué
 
Messages: 910
Inscription: 28 Mai 2007

Re: Jointure qui ne fonctionne pas

Message le Lun Mai 24, 2010 11:44

Et plus simplement sans distinct

Code: Tout sélectionner
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

DadouDuck
WRInaute impliqué
WRInaute impliqué
 
Messages: 910
Inscription: 28 Mai 2007

Re: Jointure qui ne fonctionne pas

Message le Lun Mai 24, 2010 11:51

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



YoyoS
WRInaute accro
WRInaute accro
 
Messages: 3835
Inscription: 14 Sep 2006

Re: Jointure qui ne fonctionne pas

Message le Lun Mai 24, 2010 11:56

Il dit qu'il a déjà essayé la simple jointure. Le natural join c'est un inner join caché hein ;)

DadouDuck
WRInaute impliqué
WRInaute impliqué
 
Messages: 910
Inscription: 28 Mai 2007

Re: Jointure qui ne fonctionne pas

Message le Lun Mai 24, 2010 12:06

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

fabrice88
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 289
Inscription: 15 Oct 2007

Re: Jointure qui ne fonctionne pas

Message le Lun Mai 24, 2010 20:36

bon alors voilà mes 2 tables :

Code: Tout sélectionner
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.


YoyoS
WRInaute accro
WRInaute accro
 
Messages: 3835
Inscription: 14 Sep 2006

Re: Jointure qui ne fonctionne pas

Message le Lun Mai 24, 2010 20:56

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: Tout sélectionner
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: Tout sélectionner
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
Dernière édition par YoyoS le Lun Mai 24, 2010 21:55, édité 1 fois.

fabrice88
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 289
Inscription: 15 Oct 2007

Re: Jointure qui ne fonctionne pas

Message le Lun Mai 24, 2010 21:26

Super sa fonctionne. bon j'ai adapté mais c pareil (enfin je pense)

j'ai fais ceci (sa fait gros mais sa marche) :
Code: Tout sélectionner
$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");


YoyoS
WRInaute accro
WRInaute accro
 
Messages: 3835
Inscription: 14 Sep 2006

Re: Jointure qui ne fonctionne pas

Message le Lun Mai 24, 2010 21:56

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


Si vous avez aimé cette discussion, partagez-la sur vos réseaux sociaux préférés :

Lectures recommandées sur ce thème :



Qui est en ligne

Utilisateurs parcourant ce forum: Robinson et 2 invités