Requête sql basique mais au final pas si simple

Résolu
SM05 Messages postés 10 Statut Membre -  
 SM05 -
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. SM05 Messages postés 10 Statut Membre 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
  2. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 832
     
    <?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
  3. jee pee Messages postés 31901 Date d'inscription   Statut Modérateur Dernière intervention   9 985
     
    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


    0
  4. SM05 Messages postés 10 Statut Membre 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
    0
    1. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 832
       
      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.
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. SM05 Messages postés 10 Statut Membre 1
     
    Oups,alors c'est moi qui ne comprend pas le :

    select b.version, c.version, a.logiciel
    0
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      en effet, tu ne comprends pas. qu'utilises-tu pour apprendre le langage SQL?
      as-tu essayé la solution proposée?
      0
  7. SM05 Messages postés 10 Statut Membre 1
     
    oui ça ne fonctionne pas ( mais c'est a priori l'affichage qui pose pb : je ne dois pas mettre ce qu'il faut ... )



    0
    1. jee pee Messages postés 31901 Date d'inscription   Statut Modérateur Dernière intervention   9 985
       
      pour info j'avais corrigé le sql, tu as la première version, fausse, qui n'utilise pas l'id
      0
  8. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 832
     
    Bonsoir,

    Avec une Image... on ne peut rien faire ( pas de copier/coller pour t'aider à corriger ton code)

    Donc...
    Merci de poster ton code correctement en utilisant les BALISES DE CODE.
    Explications ( à lire ENTIEREMENT ) disponibles ici : https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code

    0
  9. SM05 Messages postés 10 Statut Membre 1
     
    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 ?
    0
    1. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 832
       
      Il faut que tu cherches les jointures SQL
      0
  10. SM05 Messages postés 10 Statut Membre 1
     
    Ok merci pour tout
    0
  11. SM05
     
    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 ";
    0
    1. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 832
       
      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.
      0
  12. SM05
     
    Ok pour la solution ( ça marche bien ).

    Bien noté pour le conseil.

    Merci.
    0