Partage
  • Partager sur Facebook
  • Partager sur Twitter

SQL LEFT JOIN récupre qu'un seul row

Sujet résolu
    10 février 2021 à 1:52:42

    Salut.

    J'ai problème ou mon left join ne récupère qu'un seul row.. et pas plusieurs rows.. :

    SELECT tis_sint.id FROM tis_mast LEFT JOIN tis_sint ON tis_sint.idu = tis_mast.idu AND tis_sint.numid = tis_mast.numid WHERE tis_mast.id NOT IN ($t) AND tis_mast.dop >= `2021-01-01` ORDER BY RAND() LIMIT 2


    Donc là, cette requête doit à partir de le table tis_mast trouvé des articles... Si un article est trouvé, je prends avec left join des infos dans la table tis_sint.

    Voici un exemple:

    tis_mast:

    idu | numid
    ----|------
    5   | 1

    et tis_sint:

    id | idu | numid
    ---|-----|------
    1  |6    | 9
    ---|-----|------
    2  |5    | 1
    ---|-----|------
    3  |5    | 1

    Donc là, ce qu'il devrait me retourner ce sont les id 2 et 3, sauf que lui, il me retourne qu'un seul row, et aléatoirement, c'est à dire soit le 2 ou soit le 3...

    Je ne comprends pas pourquoi ?... Moi ce que je veux c'est avoir le 2 et le 3..

    Merci.


    • Partager sur Facebook
    • Partager sur Twitter

    Et tu auras dans cette petite ruelle au nom d'explore, une petite pièce d'or.

      10 février 2021 à 8:37:14

      Bonjour,

      Déplacement vers un forum plus approprié

      Le sujet est déplacé de la section PHP vers la section Base de données

      • Partager sur Facebook
      • Partager sur Twitter

      Pas d'aide concernant le code par MP, le forum est là pour ça :)

        10 février 2021 à 9:42:18

        Bonjour,

        En effet, je ne comprends pas pourquoi la requête ne remonte pas les deux enregistrements, en effet ...

        CentreDordi a écrit:

        AND tis_mast.dop >= `2021-01-01`

        A regarder, mais dans ta requête postée il y a des quotes obliques ... Cela devrait retourner une erreur ... tu devrais avoir des apostrophes ...

        Au passage, ici pas besoin de LEFT JOIN, une jointure interne (INNER) est suffisante ...

        Essaye ainsi :

        SELECT S.id
        FROM
        	tis_mast M
        		INNER JOIN tis_sint S
        			ON S.idu = M.idu
        			AND S.numid = M.numid
        WHERE
        	M.id NOT IN ($t)
        	AND M.dop >= '2021-01-01'
        ORDER BY RAND()
        LIMIT 2
        • Partager sur Facebook
        • Partager sur Twitter
        Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
          10 février 2021 à 12:32:07

          Salut.

          La date j'utilise la variable php ":a", c'est le client qui fixe la date. Mais sinon, je n'utilisais pas les quotes obliques.

          Après, ça ne marche toujours pas.. ça me prends toujours qu'un seul row... pas plusieurs... c'est très agaçant...

          • Partager sur Facebook
          • Partager sur Twitter

          Et tu auras dans cette petite ruelle au nom d'explore, une petite pièce d'or.

            10 février 2021 à 13:01:13

            Si tu exécutes la requête directement dans la console MySQL ou dans PHPMyAdmin que se passe-t-il ?

            Si tu enlèves le LIMIT que se passe-t-il ?

            Peux-tu poster le code qui exécute la requête et affiche le résultat ? Es-tu sûr de boucler sur le résultat pour afficher les deux lignes ...

            -
            Edité par Benzouye 10 février 2021 à 13:04:43

            • Partager sur Facebook
            • Partager sur Twitter
            Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
              10 février 2021 à 13:24:35

              Je l'ai exécuter dans la console mysql:

              SELECT S.id, M.id FROM tis_mast M INNER JOIN tis_sint S ON S.idu = M.idu AND S.numid = M.numid WHERE M.id AND M.dop >= '2021-01-01' ORDER BY RAND()

              en enlevant la LIMIT 2, et là j'ai bien tous les rows de tis_sint. Mais j'ai aussi tous les rows de tis_mast.

              table tis_mast:

              et table tis_sint:

              résultat:

              Voilà...

              Mais là le problème est que vu que je n'ai pas de LIMIT 2, ça me prend tous les rows de tis_mast, mais moi je ne veux que 2 rows de tis_mast et tous les infos qui vont avec tis_sint...

              -
              Edité par CentreDordi 10 février 2021 à 13:33:14

              • Partager sur Facebook
              • Partager sur Twitter

              Et tu auras dans cette petite ruelle au nom d'explore, une petite pièce d'or.

                10 février 2021 à 13:38:16

                Benzouye a écrit:

                Peux-tu poster le code qui exécute la requête et affiche le résultat ? Es-tu sûr de boucler sur le résultat pour afficher les deux lignes ...

                • Partager sur Facebook
                • Partager sur Twitter
                Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                  10 février 2021 à 14:24:01

                  J'ai pas compris.

                  Juste, ça c'est en train de me prendre un temps fou à résoudre.. donc je crois que je vais plutôt faire 2 requêtes séparés... l'une pour select les articles depuis tis_mast, l'autre avec les idu et numid de tis_mast prendre les infos de tis_sint... au moins j'aurais pas de problème..

                  Je te remercie pour ton aide.. en plus j'ai vu que dans cette section, tu sauves la vie de grand monde... merci..

                  • Partager sur Facebook
                  • Partager sur Twitter

                  Et tu auras dans cette petite ruelle au nom d'explore, une petite pièce d'or.

                    10 février 2021 à 16:01:27

                    Ce dont j'ai peur, c'est que ce soit dans ton code (PHP ?) que tu ne boucles pas sur les résultats ...

                    Exemple :

                    <?php
                    	$bdd = new PDO( ... );
                    	
                    	$requete = $bdd->prepare( "
                    		SELECT S.id
                    		FROM
                    			tis_mast M
                    				INNER JOIN tis_sint S
                    					ON S.idu = M.idu
                    					AND S.numid = M.numid
                    		WHERE
                    			M.id NOT IN ( $t )
                    			AND M.dop >= :a
                    		ORDER BY RAND()
                    		LIMIT 2"
                    	);
                    	$requete->execute( array(
                    		':a' => $_POST['date']
                    	));
                    	$resultats = $requete->fetchAll();
                    	
                    	foreach( $resultats as $resultat ) {
                    		var_dump( $resultat['id'] );
                    	}
                    ?>

                    L'important ici c'est le fetchAll, au lieu d'un fetch ...

                    -
                    Edité par Benzouye 10 février 2021 à 16:01:42

                    • Partager sur Facebook
                    • Partager sur Twitter
                    Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                      10 février 2021 à 16:29:19

                      Oh, non ne t'inquiète pas, j'utilise toujours fetchAll, et là aussi.. j'affichais directement le résultat:

                      $r = $r->fetchAll();
                       print_r($r);

                      Du coup, pour mon alternative, j'ai fais avec 2 requêtes différents.. ça marche..

                      • Partager sur Facebook
                      • Partager sur Twitter

                      Et tu auras dans cette petite ruelle au nom d'explore, une petite pièce d'or.

                        10 février 2021 à 17:18:24

                        C'est du grand n'importe quoi cette affaire ... je ne vois pas pourquoi tu devrais faire deux requêtes ... il faut trouver la solution ...

                        Peux-tu exécuter cette requête dans PHPMyAdmin et donner le résultat :

                        SELECT S.id
                        FROM
                            tis_mast M
                                INNER JOIN tis_sint S
                                    ON S.idu = M.idu
                                   AND S.numid = M.numid
                        WHERE M.id = 49
                        ORDER BY RAND()
                        LIMIT 2

                        Encore par curiosité peux-tu poster le code PHP en question (là où tu exécutes la requête et où tu essayes d'afficher le résultat) ?

                        -
                        Edité par Benzouye 10 février 2021 à 17:45:50

                        • Partager sur Facebook
                        • Partager sur Twitter
                        Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                          10 février 2021 à 23:19:05

                          Salut,

                          vu que cet après-midi j'ai changé la manière d'avoir les articles etc.. j'ai aussi avancer sur d'autre chose en modifiant les requêtes, avec des calculs entre les requêtes, donc ça ne servira pas à grand chose si on arrivait à résoudre ceci.. sinon ça me prendra encore des heures de modification..

                          Donc je préfère qu'on en reste là, ça te fera une enquête en moins lol...

                          Je te remercie pour ton aide (et pour ta patience sur ce sujet un peu mystérieux) !

                          Bonne semaine.

                          • Partager sur Facebook
                          • Partager sur Twitter

                          Et tu auras dans cette petite ruelle au nom d'explore, une petite pièce d'or.

                          SQL LEFT JOIN récupre qu'un seul row

                          × 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