Requête sql basique mais au final pas si simple

Résolu
Bonjour,
Je souhaite faire une requête sql basique au premier abord mais finalement pas si simple. ( Voir capture d'écran )



Est ce que quelqu'un aurait une idée?
Merci.

11 réponses

  1. 
        <section id="corps">
           <!-- Le corps -->
     
        <?php
             $query = " 
                        
    
                        SELECT b.version, c.version, a.logiciel
    from logiciel a
    join version b on b.id = a.V_mini
    join version c on c.id = a.V_maxi
    
    
                      ";
            try {
                $pdo_select = $pdo->prepare($query);  // Prépare une requête à l'exécution 
                $pdo_select->execute();               // Exécute une requête préparée
                $NbreData = $pdo_select->rowCount();  // nombre d'enregistrements (lignes)
                $rowAll = $pdo_select->fetchAll(); // fetchAll : Retourne un tableau contenant toutes les lignes du jeu d'enregistrements 
                } 
            catch (PDOException $e){
                echo 'Erreur SQL : '. $e->getMessage().'<br/>'; die(); }
                   
            // affichage
            if ($NbreData != 0) 
                {
                ?>
                <table>
                      <thead>
                            <tr>
                                <th>Version_mini</th>                          
                                <th>Version_maxi</th>
                                <th>Logiciel</th>                                                               
                            </tr>
                      </thead>
    
                      <tbody>
                            <?php
                            // pour chaque ligne (chaque enregistrement)
                            foreach ( $rowAll as $row ) 
                            {
                              // DONNEES A AFFICHER dans chaque cellule de la ligne
                            ?>
                            <tr>
                                    <td><?php echo $row['version b']; ?></td>
                                     <td><?php echo $row['version c']; ?></td>
                                    <td><?php echo $row['Logiciel']; ?></td>                                
                            </tr>
                                                  
                            <?php
                            } // fin foreach
                            ?>
                        </tbody>
    
                </table>
                <?php
              }
           else { 
                ?>
                pas de données à afficher
                <?php
                }
                ?>
        </section > 
    
    
    1. Modérateur
      <?php
      // Au debut de ton fichier .... ( AVANT LE <html> )
      // après la connexion à ta bdd...
      
      $query = " SELECT B.version as Version_mini
                 , C.version as Version_maxi
                 , A.logiciel
              FROM logiciel A
              LEFT JOIN version B on B.id = A.V_mini
              LEFT JOIN version C on C.id = A.V_maxi ";
      
      try {
        $pdo_select = $pdo->prepare($query);  // Prépare une requête à l'exécution 
        $pdo_select->execute();               // Exécute une requête préparée
        //$NbreData = $pdo_select->rowCount();  // nombre d'enregistrements (lignes) // JAMAIS SUR UNE REQUETE DE TYPE SELECT !!
        $rowAll = $pdo_select->fetchAll(); // fetchAll : Retourne un tableau contenant toutes les lignes du jeu d'enregistrements 
        $NbreData = count($rowAll);
      } catch (PDOException $e){
        echo 'Erreur SQL : '. $e->getMessage().'<br/>'; 
        die(); 
      }
                
      ?>
      


      puis, dans ta zone section
       <section id="corps">
          <!-- Le corps -->
          <?php
          // affichage
          if (!empty($rowAll )){
          ?>
          <table>
            <thead>
              <tr>
                <th>Version_mini</th>                          
                <th>Version_maxi</th>
                <th>Logiciel</th>                                                               
              </tr>
            </thead>
      
            <tbody>
              <?php
              // pour chaque ligne (chaque enregistrement)
              foreach ( $rowAll as $row ) {
                // DONNEES A AFFICHER dans chaque cellule de la ligne
              ?>
              <tr>
                <td><?php echo $row['Version_mini']; ?></td>
                 <td><?php echo $row['Version_maxi']; ?></td>
                <td><?php echo $row['Logiciel']; ?></td>                                
              </tr>
                                    
              <?php
              } // fin foreach
              ?>
            </tbody>
          </table>
          <?php
          } else { 
            echo "pas de données à afficher";     
          }
          ?>
        </section > 
      

      1. Modérateur
        Bonjour,

        Pour faire simple, on pourrait ne pas utiliser la table version, qui ne sert à rien, et juste rajouter des points entre chiffres de v_mini et v_maxi de la table logiciel ;-)

        ou pour faire compliqué quelque chose comme :

        select b.version, c.version, a.logiciel
        from logiciel a
        join version b on b.id = a.V_mini
        join version c on c.id = a.V_maxi


        1. Bonjour et merci pour ta réponse.

          Plus exactement je veux faire une table version car je veux pouvoir faire des tri dessus ( pas possible avec des versions de la forme 1.2.4 ou 1.20.12 , si j'utilise 010204 pour 1.2.4 et 012012 pour 1.20.12 c'est tout de suite plus facile .... )

          Si je comprends bien, avec ta solution " pour faire compliqué " tu utilise 2 tables de version ( chose que j'avais envisagé mais que je souhaite faire que en dernier denier recours ) .
          Merci
          1. Modérateur
            Bonjour,

            Il n'utilise pas deux tables version .... il n'utilise que La table version... mais qu'il "join" sur la colonne mini et sur la colonne maxi.
        2. Oups,alors c'est moi qui ne comprend pas le :

          select b.version, c.version, a.logiciel
          1. Contributeur
            en effet, tu ne comprends pas. qu'utilises-tu pour apprendre le langage SQL?
            as-tu essayé la solution proposée?
        3. oui ça ne fonctionne pas ( mais c'est a priori l'affichage qui pose pb : je ne dois pas mettre ce qu'il faut ... )



          1. Modérateur
            pour info j'avais corrigé le sql, tu as la première version, fausse, qui n'utilise pas l'id
        4. OK super
          J'ai juste rajouté un " as Logiciel " dans le select

          $query = " SELECT B.version as Version_mini
                          , C.version as Version_maxi
                          , A.logiciel as Logiciel
                  FROM logiciel A
                  LEFT JOIN version B on B.id = A.V_mini
                  LEFT JOIN version C on C.id = A.V_maxi ";
          


          Et voici le résultat :


          J'ai fait un INNER JOIN pour ne pas afficher les cases vides et voici le résultat :


          Bravo et merci pour votre aide !
          ps : Savez vous où je peux trouver un "petit cours" sur ce type de Select ?
          1. Modérateur
            Il faut que tu cherches les jointures SQL
        5. Pour aller un petit peu plus loin je voudrais faire un CONCAT, mais je tourne en rond et je ne trouve pas la solution.Par exemple :
          $query = " SELECT CONCAT( B.version as Version_mini
          , C.version as Version_maxi ) as ma_concatenation
          , A.logiciel as Logiciel
          FROM logiciel A
          LEFT JOIN version B on B.id = A.V_mini
          LEFT JOIN version C on C.id = A.V_maxi ";
          1. Modérateur
            SELECT CONCAT( B.version , C.version ) as ma_concatenation
            


            PS: A l'avenir, pour une nouvelle question... créé une nouvelle discussion. Tu as de la chance que j'ai vu que tu avais posté un nouveau message dans celle la.
        6. Ok pour la solution ( ça marche bien ).

          Bien noté pour le conseil.

          Merci.