Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème de jointure

La requête ne retourne rien : ni données, ni erreurs

    30 juin 2010 à 22:51:09

    Bonsoir,

    Je suis en train de faire un système de news avec plusieurs tables :
    • table "news" : la table principale du système où j'enregistre les informations principales de la news : le nombre de commentaires, le titre, le sous-titre, l'image de la news, etc...
    • table "news_version" : table où j'enregistre le texte de la news et l'id du membre qu'il l'a écrit. Plusieurs membres peuvent écrire une même news et j'enregistre chaque modification dans cette table.
    • table "commentaires" : ici je stock les commentaires des news. Je ne m'attarde pas plus dessus, ce n'est pas là que ce situe mon problème.

    J'essaie sur ma page d'accueil de récupérer la dernière news publiée (avec le titre, la date et tous les contributeurs non mineurs) sur le site avec cette requête :

    $requete = $bdd->prepare('SELECT n.id, n.titre, n.date, n.image, n.nombre_commentaires, n.id_dernier_commentaire,
    	nv.texte,
    	(SELECT NV.id_membre, M.pseudo
    		FROM news_version NV
    		INNER JOIN membres M ON M.id = NV.id_membre
    		WHERE NV.id_news = n.id AND NV.contribution_mineure = :contribution_mineure)
    	FROM news n
    	INNER JOIN news_version nv ON nv.id = n.id_derniere_version
    	WHERE n.etat = :etat ORDER BY n.id DESC LIMIT 0, 1') or die(print_r($bdd->errorInfo()));
    	$requete->execute(array('etat' => 3, 'contribution_mineure' => 0));
    	$donnees = $requete->fetchAll();
    


    Ma requête ne s'effectue pas (elle ne retourne pas de résultat) mais elle n'affiche pas d'erreurs malgré le or die(print_r($bdd->errorInfo()));

    Si quelqu'un pouvait m'aider à résoudre mon problème en m'indiquant ce qui ne va pas (pour apprendre de mes erreurs) ce serait vraiment sympa !

    Merci d'avance
    • Partager sur Facebook
    • Partager sur Twitter
      30 juin 2010 à 23:31:45

      Il pourrait être intéressant de nous donner le schéma de tes tables ainsi qu'un jeu d'essai et le résultat attendu en fonction dudit jeu d'essai pour qu'on puisse t'aider.
      • Partager sur Facebook
      • Partager sur Twitter
        1 juillet 2010 à 11:39:42

        Bonjour,

        Voici mes tables :

        news
        Image utilisateur

        - id (clé primaire)
        - id_createur
        - ip_createur
        - id_derniere_version
        - mode_redaction
        - etat
        - titre
        - sous_titre
        - date
        - image
        - commentaires
        - nombre_commentaires
        - id_dernier_commentaire
        - id_admin
        - ip_admin
        - date_validation
        - motif_refus

        --
        -- Structure de la table `news`
        --

        CREATE TABLE `news` (
        `id` int(11) NOT NULL auto_increment,
        `id_createur` int(11) NOT NULL,
        `ip_createur` int(10) NOT NULL,
        `id_derniere_version` int(11) NOT NULL,
        `mode_redaction` int(11) NOT NULL,
        `etat` int(11) NOT NULL,
        `titre` varchar(255) NOT NULL,
        `sous_titre` varchar(255) NOT NULL,
        `date` datetime NOT NULL,
        `image` varchar(255) NOT NULL,
        `commentaires` enum('0','1') NOT NULL,
        `nombre_commentaires` int(11) NOT NULL,
        `id_dernier_commentaire` int(11) NOT NULL,
        `id_admin` int(11) NOT NULL,
        `ip_admin` int(10) NOT NULL,
        `date_validation` datetime NOT NULL,
        `motif_refus` text NOT NULL,
        PRIMARY KEY (`id`)
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ;



        --
        -- Contenu de la table `news`
        --

        INSERT INTO `news` (`id`, `id_createur`, `ip_createur`, `id_derniere_version`, `mode_redaction`, `etat`, `titre`, `sous_titre`, `date`, `image`, `commentaires`, `nombre_commentaires`, `id_dernier_commentaire`, `id_admin`, `ip_admin`, `date_validation`, `motif_refus`) VALUES
        (1, 2, 2130706433, 1, 1, 3, 'Bienvenue sur la version 1.0 !', 'Enfin sa sortie !', '2010-01-09 16:51:52', '', '1', 0, 0, 2, 2130706433, '2010-01-09 17:03:31', ''),
        (2, 2, 2130706433, 3, 1, 3, 'Communiquez avec les autres membres !', 'Sortie du nouveau système de messagerie privée', '2010-05-25 18:26:32', 'uploads/news/3.png', '1', 4, 4, 2, 2130706433, '2010-05-25 18:32:02', '');



        news_version
        Image utilisateur

        - id (clé primaire)
        - id_news
        - id_membre
        - ip_membre
        - texte
        - date
        - raison
        - contribution_mineure

        --
        -- Structure de la table `news_version`
        --

        CREATE TABLE `news_version` (
        `id` int(11) NOT NULL auto_increment,
        `id_news` int(11) NOT NULL,
        `id_membre` int(11) NOT NULL,
        `ip_membre` int(10) NOT NULL,
        `texte` text NOT NULL,
        `date` datetime NOT NULL,
        `raison` text NOT NULL,
        `contribution_mineure` enum('0','1') NOT NULL,
        PRIMARY KEY (`id`)
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ;

        --
        -- Contenu de la table `news_version`
        --

        INSERT INTO `news_version` (`id`, `id_news`, `id_membre`, `ip_membre`, `texte`, `date`, `raison`, `contribution_mineure`) VALUES
        (1, 1, 2, 2130706433, 'TEXTE NEWS 1', '2010-01-09 16:51:52', 'Création', '0'),
        (2, 2, 2, 2130706433, 'Voici le news', '2010-05-25 18:26:32', 'Création', '0');
        (3, 2, 1, 2130706433, 'Voici la news', '2010-05-25 18:26:32', 'Modification d\'une erreur', '0');



        membres
        - id (clé primaire)
        - pseudo
        + d'autres champs (inutile pour ma requête)

        --
        -- Structure de la table `membres`
        --

        CREATE TABLE `membres` (
        `id` int(11) NOT NULL auto_increment,
        `pseudo` varchar(255) NOT NULL,
        PRIMARY KEY (`id`),
        UNIQUE KEY `pseudo` (`pseudo`),
        ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;

        --
        -- Contenu de la table `membres`
        --

        INSERT INTO `membres` (`id`, `pseudo`) VALUES
        (1, 'Membre 1'),
        (2, 'Belion');



        Voici mes tables et le jeu d'essai (désolé je ne sais pas faire les schémas de tables alors j'ai fait comme ça).

        Pour le résultat attendu de ma requête, le voici :
        n.id = 2 (id de la dernière news)
        n.titre = Communiquez avec les autres membres ! (titre de la derniere news)
        n.date = 2010-05-25 18:26:32 (date de création de la dernière news)
        n.image = uploads/news/3.png (image de la dernière news )
        n.nombre_commentaires = 4
        n.id_dernier_commentaire = 4
        nv.texte = Voici la news
        NV.id_membre = array(1 => 2, 2 => 1)
        M.pseudo = array(1 => 'Belion', 2 => 'Membre 1')

        Merci d'avance pour votre aide.
        • Partager sur Facebook
        • Partager sur Twitter
          1 juillet 2010 à 11:51:50

          Est-ce que tu t'es connecté à ta base de donnée via php?
          Si tu ne la pas fait, alors fais-le car c'est sans doute le problème.
          • Partager sur Facebook
          • Partager sur Twitter

          Superloup

            1 juillet 2010 à 12:00:43

            Citation : superloup

            Est-ce que tu t'es connecté à ta base de donnée via php?
            Si tu ne la pas fait, alors fais-le car c'est sans doute le problème.



            Oui, je suis bien connecté à ma base de données puisque quand j'effectue le code suivant, ma requête marche.
            $requete = $bdd->prepare('SELECT n.id, n.titre, n.date, n.image, n.nombre_commentaires, n.id_dernier_commentaire,
            	nv.texte
            	FROM news n
            	INNER JOIN news_version nv ON nv.id = n.id_derniere_version
            	WHERE n.etat = :etat ORDER BY n.id DESC LIMIT 0, 1') or die(print_r($bdd->errorInfo()));
            	$requete->execute(array('etat' => 3));
            	$derniere_news = $requete->fetchAll();
            


            J'en ai donc déduit que c'était le code suivant qui ne marchait pas.
            (SELECT NV.id_membre, M.pseudo
            	FROM news_version NV
            	INNER JOIN membres M ON M.id = NV.id_membre
            	WHERE NV.id_news = n.id AND NV.contribution_mineure = :contribution_mineure)
            


            Belion
            • Partager sur Facebook
            • Partager sur Twitter

            Problème de jointure

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown