Jointure qui ne fonctionne pas

Discussion dans 'Développement d'un site Web ou d'une appli mobile' créé par fabrice88, 23 Mai 2010.

  1. fabrice88
    fabrice88 WRInaute occasionnel
    Inscrit:
    15 Octobre 2007
    Messages:
    316
    J'aime reçus:
    0
    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 ?
     
  2. Dr DLP
    Dr DLP WRInaute impliqué
    Inscrit:
    29 Juin 2003
    Messages:
    525
    J'aime reçus:
    0
    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 :)
     
  3. fabrice88
    fabrice88 WRInaute occasionnel
    Inscrit:
    15 Octobre 2007
    Messages:
    316
    J'aime reçus:
    0
    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
     
  4. YoyoS
    YoyoS WRInaute accro
    Inscrit:
    14 Septembre 2006
    Messages:
    3 225
    J'aime reçus:
    0
    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.
     
  5. DadouDuck
    DadouDuck WRInaute impliqué
    Inscrit:
    28 Mai 2007
    Messages:
    812
    J'aime reçus:
    0
    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
    
     
  6. DadouDuck
    DadouDuck WRInaute impliqué
    Inscrit:
    28 Mai 2007
    Messages:
    812
    J'aime reçus:
    0
    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 :
     
  7. YoyoS
    YoyoS WRInaute accro
    Inscrit:
    14 Septembre 2006
    Messages:
    3 225
    J'aime reçus:
    0
    Il dit qu'il a déjà essayé la simple jointure. Le natural join c'est un inner join caché hein ;)
     
  8. DadouDuck
    DadouDuck WRInaute impliqué
    Inscrit:
    28 Mai 2007
    Messages:
    812
    J'aime reçus:
    0
    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
     
  9. fabrice88
    fabrice88 WRInaute occasionnel
    Inscrit:
    15 Octobre 2007
    Messages:
    316
    J'aime reçus:
    0
    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.
     
  10. YoyoS
    YoyoS WRInaute accro
    Inscrit:
    14 Septembre 2006
    Messages:
    3 225
    J'aime reçus:
    0
    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
     
  11. fabrice88
    fabrice88 WRInaute occasionnel
    Inscrit:
    15 Octobre 2007
    Messages:
    316
    J'aime reçus:
    0
    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"); 
     
  12. YoyoS
    YoyoS WRInaute accro
    Inscrit:
    14 Septembre 2006
    Messages:
    3 225
    J'aime reçus:
    0
    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 :)
     
Chargement...
Similar Threads - Jointure fonctionne Forum Date
Jointure SQL ne fonctionne pas.. Développement d'un site Web ou d'une appli mobile 12 Septembre 2006
Optimisation requêtes : jointures / index ? Développement d'un site Web ou d'une appli mobile 28 Juin 2014
Problème en Les Jointure Développement d'un site Web ou d'une appli mobile 14 Mai 2014
Optimisation de requêtes par jointure Développement d'un site Web ou d'une appli mobile 1 Juillet 2013
PB résultat Requête SQL avec jointure 3 tables Développement d'un site Web ou d'une appli mobile 12 Juin 2013
2 requêtes ou jointure ? Développement d'un site Web ou d'une appli mobile 9 Avril 2013
Jointure multi tables Développement d'un site Web ou d'une appli mobile 5 Avril 2013
problème de jointure Débuter en référencement 20 Décembre 2012
Optimisation + jointure Développement d'un site Web ou d'une appli mobile 23 Avril 2012
Problème de jointure entre deux tables requête SQL Développement d'un site Web ou d'une appli mobile 11 Avril 2011
MySQL, jointures multiples, WHERE et psychiatrie Développement d'un site Web ou d'une appli mobile 27 Juillet 2010
Jointure sql problème inner join Développement d'un site Web ou d'une appli mobile 4 Mai 2010
Comment simplifier une double requête par jointure? Développement d'un site Web ou d'une appli mobile 2 Mars 2010
inconvénients des jointures sur le temp de traitement d'une requette Développement d'un site Web ou d'une appli mobile 27 Août 2009
MYSQL : jointure Développement d'un site Web ou d'une appli mobile 29 Juillet 2009
JOINTURE SQL: problème de doublon Développement d'un site Web ou d'une appli mobile 24 Mars 2009
[résolu] jointure et 'distinct' Développement d'un site Web ou d'une appli mobile 6 Janvier 2009
Problème choix syntaxe jointure Développement d'un site Web ou d'une appli mobile 4 Août 2008
(Résolu par une jointure)[MYSQL] Dissocier ma requête ? Administration d'un site Web 16 Juin 2008
Enregistrements non compris dans une jointure SQL Développement d'un site Web ou d'une appli mobile 30 Janvier 2008