Partage
  • Partager sur Facebook
  • Partager sur Twitter

Résultat requete sur 1 table

en fonction du nombre de résultat sur 1 autre

Sujet résolu
    1 septembre 2010 à 12:35:51

    Bonjour,

    Je souhaite afficher une liste de catégories, inscrites dans une table de ma base de données.
    Je ne souhaite afficher le titre de la catégorie uniquement si un enregistrement d'une autre table lui est associé.
    Je n'arrive pas à créer ma requête SQL pour ensuite afficher les résultats via mysql_fetch-array et une boucle while.

    Voici mes tables :

    TABLE elements_categories
    • CHAMPS
    • id_categorie
    • elements_categories_titre

    TABLE elements
    • CHAMPS
    • elements_id
    • id_categorie


    Je souhaite donc obtenir la liste des 'elements_categories_titre' pour lesquels au moins 1 'id_categorie' de la table 'elements' correspond à son 'id_categorie' dans la table 'elements_categories'

    J'espère avoir bien décrit mon problème

    Merci d'avance de vos réponses.


    • Partager sur Facebook
    • Partager sur Twitter
      1 septembre 2010 à 12:47:03

      bonjour,
      un SELECT imbriqué du type
      SELECT * FROM table1 WHERE colonne = 
      (SELECT colonne FROM table2 WHERE condition);
      
      • Partager sur Facebook
      • Partager sur Twitter
        1 septembre 2010 à 14:06:28

        Ça correspond à une jointure standard non ??

        SELECT DISTINCT elements_categorie_titre
        FROM elements_categorie
        INNER JOIN elements
        ON elements_categorie.id_categorie = elements.id_categorie
        

        (Ça doit marcher avec un NATURAL JOIN aussi.)
        • Partager sur Facebook
        • Partager sur Twitter
        Ce n'est pas parce que vous ne savez pas vous servir d'un marteau qu'il faut planter des clous au tournevis.
          1 septembre 2010 à 14:45:12

          Bonjour,

          Merci de vos réponses!
          J'ai utilisé la jointure qui fonctionne très bien.
          La jointure standard "JOIN" suffit dans mon cas.

          J'ai juste ajouté un filtre pour ne pas afficher les catégories pour lesquels il n'y aurait pas d'élément publié sur le site :

          SELECT DISTINCT elements_categorie_titre
          FROM elements_categorie
          JOIN elements
          ON elements_categorie.id_categorie = elements.id_categorie
          AND elements.elements_online!=0
          


          Merci de votre contribution!
          Excellente journée...
          • Partager sur Facebook
          • Partager sur Twitter
            1 septembre 2010 à 15:04:04

            Yep INNER JOIN = JOIN
            Par soucis de performance je te propose
            SELECT DISTINCT elements_categorie_titre
            FROM elements_categorie
            JOIN (SELECT id_categorie FROM elements WHERE elements_online<>0)A
            ON elements_categorie.id_categorie = A.id_categorie
            
            • Partager sur Facebook
            • Partager sur Twitter
            Ce n'est pas parce que vous ne savez pas vous servir d'un marteau qu'il faut planter des clous au tournevis.
              1 septembre 2010 à 16:09:40

              tu penses qu'il y a une réelle différence de perf entre ces deux formules?
              La liste des catégories ne dépassera jamais la dizaine par contre les éléments vont être nombreux au fur et à mesure de la vie du site.

              Je viens de faire quelques tests de temps d'exécution et ce n'est pas flagrand. Le SELECT prend 1 fois sur 3 plus de temps.

              D'où ma question :
              La différence de perf se ressentira donc dans quel cas :
              - sur des catégories nombreuses ?
              - sur des éléments nombreux ?



              • Partager sur Facebook
              • Partager sur Twitter
                1 septembre 2010 à 16:18:56

                Euh d'ailleurs je me suis trompé je crois ; dans le cas de nombreux éléments cette requête deviendra de plus en plus rapide (en considérant que le rapport online/offline soit conséquent) :

                SELECT DISTINCT elements_categorie_titre
                FROM (SELECT id_categorie FROM elements WHERE elements_online<>0)A
                JOIN elements_categorie
                ON elements_categorie.id_categorie = A.id_categorie
                
                • Partager sur Facebook
                • Partager sur Twitter
                Ce n'est pas parce que vous ne savez pas vous servir d'un marteau qu'il faut planter des clous au tournevis.
                  1 septembre 2010 à 16:36:45

                  Ok c'est bien mon cas alors, les éléments vont devenir de + en + nombreux.
                  Par contre la requête précédente fonctionne bien, les 2 fonctionnent d'ailleurs?

                  • Partager sur Facebook
                  • Partager sur Twitter
                    1 septembre 2010 à 16:40:22

                    Oui les deux fonctionnent, après je suis pas spécialiste des schémas d'exécution ^^'
                    Le principe est de réduire le nombre d'enregistrements en posant une condition avant la jointure. Tu pourras faire des tests quand tu auras beaucoup d'enregistrements ^^
                    • Partager sur Facebook
                    • Partager sur Twitter
                    Ce n'est pas parce que vous ne savez pas vous servir d'un marteau qu'il faut planter des clous au tournevis.
                      1 septembre 2010 à 16:59:42

                      OK, je testerai volontiers plus tard quand la base de données sera plus conséquente.

                      Merci beaucoup pour ton aide...

                      • Partager sur Facebook
                      • Partager sur Twitter

                      Résultat requete sur 1 table

                      × 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