Requete mysql mal formulé

Bonjour,

Dans un script bash je voudrai interroger la basse de données, seulement je ne trouve pas comment formuler la requete ?

code bash (Linux)
nom_table4="modules_x10"    
colonne_recherche4="type"    
recherche4="L"    
select_noms_colonnes4_1="code_maison_unite"    


sql9(){    
mysql -h "$hote_db" -D "$nom_bd" -u "$login_db" -p"$pass_bd" \    
  --default-character-set=$format_texte -B -N -e "SELECT $select_noms_colonnes4_1 FROM $nom_table4 WHERE $colonne_recherche4 LIKE '$recherche4%'"     
        }    

echo $(sql9)


Il m'affiche comme résultat

serveur@debian:~$ e-lall-on    
B1 B2 C1 E1 E9     
serveur@debian:~$


ors il me faut uniquement le résultat avec le "code_maison_unite" E1 E9, il faudrait qu'il m'affiche le résultat comme ceci,
E1 E9


De fàçon a ce qu'il puisse m'afficher
tout ce qu'il trouve qui commence par la lettre "L" dans "type" en m'affichant le résultat de "code_maison_unite" de "E" uniquement, ors il m'affiche toute la basse y compris les autres lettres B1, B2, C1

Bd
+----+-------------------------------------+-------------------+------+
| id | nom_module | code_maison_unite | type |
+----+-------------------------------------+-------------------+------+
| 17 | Lumière du salon | B1 | LD11 |
| 18 | Lumière cheminé | B2 | LM12 |
| 33 | Lumière chambre | C1 | LD11 |
| 65 | Lumière bureau | E1 | LD11 |
| 73 | Lumière salle de sport | E9 | LD11 |
+----+-------------------------------------+-------------------++------+

Je n'arrive pas a formuler la requete ?
Pouvez-vous m'aider ?
Merci.

27 réponses

Résumé de la discussion

Formuler une requête MySQL depuis un script Bash afin de filtrer les résultats suppose d'utiliser des critères sur le champ type et sur le code_maison_unite, plutôt que d afficher toute la table. Les propositions centrales suggèrent d'utiliser WHERE type LIKE 'L%' AND code_maison_unite LIKE 'E%' pour ne récupérer que les lignes correspondant à des lumières dont le code est dans le groupe E. Dans les exemples, on voit comment extraire uniquement la colonne code_maison_unite via mysql -e et supprimer l'en-tête avec sed '1d' ou boucler sur les lignes pour n'afficher que E1 et E9. Optionnel mais utile, l'encodage UTF-8 doit être actif pour éviter les caractères accentués affichés comme des points d'interrogation lors de l'affichage des résultats dans le terminal.

Bobot (l’IA à votre service)
  1. Contributeur
    Pourquoi ne pas regarder dans les logs mysql si elles sont actives quelle requête a été exécutée ?
    1. Bonjour,

      Le fichier log est vide.
      root@debian:~# cat /var/log/mysql.log 
      root@debian:~# 


      Mais a mon avis ce n'est pas une erreur car la requete fonction mais je n'arrive pas a obtenir ce que je voudrai comme résultat.

      Merci.
      1. Contributeur
        Effectivement j'ai mal lu.

        WHERE $colonne_recherche4 LIKE '$recherche4%'"

        Dans ce cas après le WHERE rajouter un AND $colonne_recherche3 LIKE '$recherche3%'

        Où :

        $colonne_recherche3 = code_maison_unite
        $recherche3 = E


        Le loup, solitaire et mystérieux.
        1. Bonjour,

          Je n'ai aucune réponse vide.
          J'ai ajouté un AND $colonne_recherche3 LIKE '$recherche4%' après le "WHERE $colonne_recherche4"

          nom_table4="modules_x10"
          colonne_recherche4="type"
          recherche4="L"
          select_noms_colonnes4_1="code_maison_unite"

          colonne_recherche3="code_maison_unite"
          recherche3="E"

          sql9(){
          mysql -h "$hote_db" -D "$nom_bd" -u "$login_db" -p"$pass_bd" \
          --default-character-set=$format_texte -B -N -e "SELECT $select_noms_colonnes4_1 FROM $nom_table4 WHERE $colonne_recherche4 AND $colonne_recherche3 LIKE '$recherche3%'"
          }

          echo $(sql9)

          Êtes-vous sûr qu'il va m'afficher tous ce qui commence par la lettre "L" du champ "type" en m'affichant le résultat du champ "code_maison_unite" comme ceci.
          E1 E9


          Merci.
          1. Contributeur
            Et le résultat?
        2. Contributeur
          Non c'est pas bon.

          Vous avez oublié des choses, peut être que je me suis mal exprimé.

          sql9(){
          mysql -h "$hote_db" -D "$nom_bd" -u "$login_db" -p"$pass_bd" \
          --default-character-set=$format_texte -B -N -e "SELECT $select_noms_colonnes4_1 FROM $nom_table4 WHERE $colonne_recherche4 AND $colonne_recherche3 LIKE '$recherche3%'"
          }

          Après le WHERE il faut aussi comparer $colonne_recherche4

          Donc ça donne :

          sql9(){
          mysql -h "$hote_db" -D "$nom_bd" -u "$login_db" -p"$pass_bd" \
          --default-character-set=$format_texte -B -N -e "SELECT $select_noms_colonnes4_1 FROM $nom_table4 WHERE $colonne_recherche4 LIKE '$recherche4%' AND $colonne_recherche3 LIKE '$recherche3%'"
          }


          Le loup, solitaire et mystérieux.
          1. Bonjour,

            C'est pareil, aucun résultat s'afficche ?

            nom_table4="modules_x10"   
            colonne_recherche4="type"   
            recherche4="L"   
            select_noms_colonnes4_1="code_maison_unite"   
            
            nom_table4="modules_x10"   
            colonne_recherche3="code_maison_unite"   
            recherche3="E"   
            select_noms_colonnes4_1="code_maison_unite"   
            
            sql9(){   
            mysql -h "$hote_db" -D "$nom_bd" -u "$login_db" -p"$pass_bd" \   
            --default-character-set=$format_texte -B -N -e "SELECT $select_noms_colonnes4_1 FROM $nom_table4 WHERE $colonne_recherche4 LIKE '$colonne_recherche4%' AND $colonne_recherche3 LIKE '$recherche3%'"   
                  }    
            
            echo $(sql9)


            Bd
            +----+-------------------------------------+-------------------+------+
            | id | nom_module | code_maison_unite | type module|
            +----+-------------------------------------+-------------------+------+
            | 17 | Lumière du salon | B1 | LD11 |
            | 18 | Lumière cheminé | B2 | LM12 |
            | 33 | Lumière chambre | C1 | LD11 |
            | 65 | Lumière bureau | E1 | LD11 |
            | 73 | Lumière salle de sport | E9 | LD11 |
            +----+-------------------------------------+-------------------++------+

            Il faut qu'il trouve tout ce qui commence par la lettre 'L' du champ "type" et qu'il m'affiche le résultat part le "champ code_maison_unite" mais uniquement "E1 E9" pas "B1 B2 C2", je n'arrive pas a y trier via la requete.

            L = c'est les lumières (LM12/LD11).
            A = c'est les appareils (AM12/AD10).
            C'est requête me permettra d'allumer toutes les lumières du code maison unité du groupe E (E1 E9).

            Merci.
            1. Contributeur
              J'ai corrigé mon post précédent, je m'étais trompé dans le LIKE.

              sql9(){
              mysql -h "$hote_db" -D "$nom_bd" -u "$login_db" -p"$pass_bd" \
              --default-character-set=$format_texte -B -N -e "SELECT $select_noms_colonnes4_1 FROM $nom_table4 WHERE $colonne_recherche4 LIKE '$recherche4%' AND $colonne_recherche3 LIKE '$recherche3%'"
              }


              Le loup, solitaire et mystérieux.
              1. Bonjour

                Ouf ça marche.
                format_texte="utf8"
                nom_table4="modules_x10"
                colonne_recherche4="type"
                recherche4="L"
                select_noms_colonnes4_1="code_maison_unite"
                
                nom_table4="modules_x10"
                colonne_recherche3="code_maison_unite"
                recherche3="E"
                select_noms_colonnes4_1="code_maison_unite"
                
                sql9(){
                
                mysql -h "$hote_db" -D "$nom_bd" -u "$login_db" -p"$pass_bd" \
                --default-character-set=$format_texte -B -N -e "SELECT $select_noms_colonnes4_1 FROM $nom_table4 WHERE $colonne_recherche4 LIKE '$recherche4%' AND $colonne_recherche3 LIKE '$recherche3%'"
                
                      }  
                
                echo $(sql9)


                Résultat affiché
                E1 E9


                Merci.
                1. Bonjour

                  Je l'ai refait propre, pour ceux qui son intéressé

                  nom_table4="modules_x10"
                  colonne_recherche4_1="type"
                  recherche4_1="L"
                  select_noms_colonnes4_1="code_maison_unite"
                  colonne_recherche4_2="code_maison_unite"
                  recherche4_2="E"
                  select_noms_colonnes4_1="code_maison_unite"
                  
                  sql9(){
                  
                  mysql -h "$hote_db" -D "$nom_bd" -u "$login_db" -p"$pass_bd" \
                  --default-character-set=$format_texte -B -N -e "SELECT $select_noms_colonnes4_1 FROM $nom_table4 WHERE $colonne_recherche4_1 LIKE '$recherche4_1%' AND $colonne_recherche4_2 LIKE '$recherche4_2%'"
                  
                        }  
                  
                  echo $(sql9)


                  En tableau
                  mysql -h "$hote_db" -D "$nom_bd" -u "$login_db" -p"$pass_bd" \
                        --default-character-set=$format_texte  -e"SELECT $select_noms_colonnes4_1 FROM $nom_table4 WHERE $colonne_recherche4_1 LIKE '$recherche4_1%' AND $colonne_recherche4_2 LIKE '$recherche4_2%'"


                  Merci.
                  1. Bonjour,

                    Je viens de faire cette requête et l'affichage est en plusieurs lignes ????

                    sql2(){  
                    mysql -h "$hote_db" -D "$nom_bd" -u "$login_db" -p"$pass_bd" \  
                    --default-character-set=$format_texte -B -N -e "SELECT $select_noms_colonnes5_1 FROM $nom_table5 WHERE $colonne_recherche5_1 LIKE '$recherche5_1%' AND $colonne_recherche5_2 LIKE '$recherche5_2%'"  
                            }  
                    
                    for fieldD in $(sql2) ; do  
                    echo Nom du module : ${fieldD}  
                    done


                    Il m'affiche le résultat comme ceci
                    Nom du module : Lumière  
                    Nom du module : plafond  
                    Nom du module : salle  
                    Nom du module : informatique  
                    Nom du module : Lumière  
                    Nom du module : salle  
                    Nom du module : de  
                    Nom du module : sport


                    Au lieu de me l'afficher comme ceci
                    Lumière plafond salle informatique  
                    Lumière salle de sport


                    Merci.
                    1. Contributeur
                      Ceci est normal, car par défaut la boucle for utilise le séparateur espace " ".

                      Donc lorsque vous faites votre requête, tout s'affiche correctement.

                      Par contre lorsque la valeur de retour de SQL2 est parsée dans le FOR, celui-ci incluant les espaces comme séparateur de ligne, alors les valeurs de la table ne sont pas côte à côte mais les unes en dessous des autres.

                      Un peu de lecture :

                      https://forums.commentcamarche.net/forum/affich-37620017-comment-lire-un-fichier-ligne-par-ligne
                      1. Bonjour,

                        J'ai mis ceci
                        format_texte="utf8"
                        requete="connect domotique;  SELECT $select_noms_colonnes5_1 FROM $nom_table5 WHERE $colonne_recherche5_1 LIKE '$recherche5_1%' AND $colonne_recherche5_2 LIKE '$recherche5_2%'"
                        mysql -u $login_db -D $nom_bd -h $hote_db -p$pass_bd -e "$requete" | while read son_on; do 
                        echo "$son_on"
                        done
                        echo ""


                        Et il m'affiche le résultat comme ceci avec des "?" a la place des accents ?
                        nom_module
                        Lumi?re plafond salle informatique
                        Lumi?re salle de sport


                        Comment faire ?

                        Merci.
                        1. Contributeur
                          Z'auriez pas oublié cela par hasard ? :-)

                          --default-character-set=$format_texte

                          Comme vous l'aviez mis auparavant.
                          1. Bonsoir,

                            Oui tout a fait, un oublie c'est la fatigue il est tard.

                            requete="connect domotique;  SELECT $select_noms_colonnes5_1 FROM $nom_table5 WHERE $colonne_recherche5_1 LIKE '$recherche5_1%' AND $colonne_recherche5_2 LIKE '$recherche5_2%'"
                            mysql -u $login_db -D $nom_bd -h $hote_db -p$pass_bd  --default-character-set=$format_texte  -e "$requete" | sed '1d' | while read son_on; do 
                            echo "$son_on"
                            done
                            echo ""


                            Merci.
                            1. Bonsoir,

                              Décidément, J'ai récupérer l'ids d'un table pour afficher une autre table avec ce code bash avec la variable $lignes3.
                              mysql -u $login_db -D $nom_bd -h $hote_db -p$pass_bd  --default-character-set=$format_texte  -e "connect $nom_bd;  SELECT $select_noms_colonnes5_2 FROM $nom_table5 WHERE $colonne_recherche5_1 LIKE '$recherche5_1%' AND $colonne_recherche5_2 LIKE '$recherche5_2%'" | sed '1d' | while read lignes3; do  
                              $lignes3" 
                              done


                              Résultat
                              65 
                              73


                              mais quand je fait ceci c'est toute la table qui s'affiche sur des kilomètres
                              sql06="SELECT $select_noms_colonnes1_2 FROM $nom_table1 WHERE id LIKE '$lignes3%'" 
                              mysql -u $login_db -D $nom_bd -h $hote_db -p$pass_bd  --default-character-set=$format_texte  -e "$sql06" | sed '1d' | while read lignes6; do  
                              echo "resultat test 6 : $lignes6" 
                              done


                              Il m'affiche sur des kilomètres
                              resultat test 6 :  
                              resultat test 6 :  
                              resultat test 6 :  
                              resultat test 6 :  
                              resultat test 6 :  
                              resultat test 6 :  
                              resultat test 6 :  
                              resultat test 6 :  
                              resultat test 6 : e-lall-on 
                              resultat test 6 :  
                              resultat test 6 :  
                              resultat test 6 :  
                              resultat test 6 :  
                              resultat test 6 :  
                              resultat test 6 :  
                              resultat test 6 :  
                              resultat test 6 : e-lall-on 
                              resultat test 6 :  
                              resultat test 6 :  
                              resultat test 6 :  
                              resultat test 6 :  
                              resultat test 6 :  
                              resultat test 6 :  
                              resultat test 6 :  
                              resultat test 6 :  
                              resultat test 6 :  
                              resultat test 6 :  
                              resultat test 6 : 


                              au lieu de m'afficher :
                              resultat test 6 : e-lall-on 
                              resultat test 6 : e-lall-on


                              Ou ce trouve mon erreur ?

                              Merci.
                              1. Contributeur
                                Déjà en ne faisant que cela, qu'est ce que ça donne :

                                sql06="SELECT $select_noms_colonnes1_2 FROM $nom_table1 WHERE id LIKE '$lignes3%'"

                                mysql -u $login_db -D $nom_bd -h $hote_db -p$pass_bd --default-character-set=$format_texte -e "$sql06" | while read lignes6; do
                                echo "resultat test 6 : $lignes6"
                                done
                                1. Bonsoir,

                                  ça donne donne exactement la même chose avec en plus le nom de la colonne qu'il affiche en 1er ligne.
                                  Il m'affiche toute la table sur des kilomètres
                                  resultat test 6 :  fichier_cm_lumiere_all_on      
                                  resultat test 6 :        
                                  resultat test 6 :        
                                  resultat test 6 :        
                                  resultat test 6 :        
                                  resultat test 6 :        
                                  resultat test 6 :        
                                  resultat test 6 :        
                                  resultat test 6 : e-lall-on       
                                  resultat test 6 :        
                                  resultat test 6 :        
                                  resultat test 6 :        
                                  resultat test 6 :        
                                  resultat test 6 :        
                                  resultat test 6 :        
                                  resultat test 6 :        
                                  resultat test 6 : e-lall-on       
                                  resultat test 6 :        
                                  resultat test 6 :        
                                  resultat test 6 :        
                                  resultat test 6 :        
                                  resultat test 6 :        
                                  resultat test 6 :        
                                  resultat test 6 :        
                                  resultat test 6 :        
                                  resultat test 6 :        
                                  resultat test 6 :        
                                  resultat test 6 : 


                                  La table bash
                                   id     
                                   cmu     
                                   ordre_on      
                                   fichier_on      
                                   macro_on      
                                   ordre_off       
                                   fichier_off     
                                   macro_off     
                                   ordre_dim     
                                   fichier_dim      
                                   macro_dim     
                                   ordre_bri      
                                   fichier_bri      
                                   macro_bri     
                                   heure_minuterie     
                                   minute_minuterie     
                                   seconde_minuterie     
                                   fichier_minuterie     
                                   macro_minuterie     
                                   fichier_cm_lumiere_all_on     
                                   macro_cm_all_on


                                  Ma requête tel que je l'ai formulé
                                  resultat sql06 : SELECT fichier_cm_lumiere_all_On FROM bash WHERE id LIKE '%'


                                  Le " LIKE '%' " a la fin de la requête n'affiche pas la variable '$lignes3%'" de la requête sql06

                                  merci.
                                  1. Contributeur
                                    J'ai une petite question.

                                    Dans ta requête que voici :

                                    SELECT $select_noms_colonnes1_2 FROM $nom_table1 WHERE id LIKE '$lignes3%'

                                    A quoi correspond $select_noms_colonnes1_2 ainsi que $lignes3 ?

                                    Parce que tel quel, si toute la table s'affiche, c'est normalement qu'il y autant de lignes dans la table.

                                    Ceci dit, est-ce que la valeur de $select_noms_colonnes1_2 est toujours non vide dans la table?

                                    Parce que tel quel, mettons que la colonne id soit toujours non NULL, si la colonne $select_noms_colonnes1_2 elle n'est pas forcément non NULL, alors il est normal avec le like de trouver autant de données et autant de données vides.

                                    Si la valeur de $lignes3 est fixe, c'est à dire qu'on veut chercher les lignes par rapport à la valeur $lignes3 et non pas par rapport à un ID qui contiendrait $lignes3, dans ce cas il ne faut pas faire de LIKE mais plutôt :

                                    SELECT $select_noms_colonnes1_2 FROM $nom_table1 WHERE id='$lignes3'

                                    1. Bonsoir,

                                      Cela vient de la variable $Lignes3 de la fin de la requête qui ne s'affiche pas.

                                      Vérification de ma requête tel que je l'ai formulé
                                      resultat sql06 : SELECT fichier_cm_lumiere_all_On FROM bash WHERE id LIKE '%'

                                      Le " LIKE '%' " a la fin de la requête n'affiche pas la variable '$lignes3%'" de la requête sql06

                                      Avec la requête formulé comme vous dite j'avais dèjas testé il y a le même probléme avec la variable a la fin de la requête qui ne s'affiche pas
                                      SELECT $select_noms_colonnes1_2 FROM $nom_table1 WHERE id='$lignes3'

                                      Vérification de votre requête
                                      resultat sql06 : SELECT fichier_cm_lumiere_all_On FROM bash WHERE id='' 


                                      merci.
                                      • 1
                                      • 2