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. Bonjour

    Avec la requête formulé comme ceci :
    sql06="SELECT $select_noms_colonnes1_2 FROM $nom_table1 WHERE id='$lignes3'"


    bash m'affiche
    /home/serveur/Domotique/ordres/e-lall-on: line 260: Erreur de syntaxe près du symbole inattendu « done »
    /home/serveur/Domotique/ordres/e-lall-on: line 260: 'done'

    La ligne 260 est
    done


    code bash
    sql06="SELECT $select_noms_colonnes1_2 FROM $nom_table1 WHERE id='$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  
    done 
    echo "" 
    echo "Requête sql06 :" $sql06


    Merci.
    1. Bonsoir,

      j'ai mis
      sql06="SELECT $select_noms_colonnes1_2 FROM $nom_table1 WHERE id LIKE \'$lignes3%\' "
      echo "Requete a executer : " $sql06


      Rien ne s'affiche

      Bash m'affiche
      Requete a executer :  SELECT fichier_cm_lumiere_all_On FROM bash WHERE id LIKE \'%\'
      ERROR at line 1: Unknown command '\''.


      La variable $ligne3 ne s'affiche pas dans le retour de la requête.
      Merci.
      1. bonsoir,

        ben alors,
        j'ai mis ce que vous m'avez dit

        sql06="SELECT $select_noms_colonnes1_2 FROM $nom_table1 WHERE id LIKE \'" $lignes3"\'"
        echo "Requete a executer : " $sql06


        et bash répond
        /home/serveur/Domotique/ordres/e-lall-on: line 257: \' : commande introuvable
        Requete a executer : 


        La ligne 257 est :
        sql06="SELECT $select_noms_colonnes1_2 FROM $nom_table1 WHERE id LIKE \'" $lignes3"\'"

        Merci.
        1. Contributeur
          Alors dans ce cas :

          sql06="SELECT $select_noms_colonnes1_2 FROM $nom_table1 WHERE id LIKE \'$lignes3%\' "
      2. Bonsoir,

        J'ai sais que vous avez modifié votre post précédent, mais voila le résultat après modification de votre post précédent.

        j'ai mis :
        sql06="SELECT $select_noms_colonnes1_2 FROM $nom_table1 WHERE id LIKE '" $lignes3"'"   
        echo "Requete a executer : " $sql06


        bash répond
        /home/serveur/Domotique/ordres/e-lall-on: line 257: ' : commande introuvable   
        Requete a executer : 


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


        Merci.
        1. Contributeur
          Dans ce cas essayez :

          sql06="SELECT $select_noms_colonnes1_2 FROM $nom_table1 WHERE id LIKE \'" $lignes3"\'"
      3. Bonsoir

        A force de maniper sur plusieurs langages, on se perd "oui moi aussi"

        Avec ceci :

        sql06="SELECT $select_noms_colonnes1_2 FROM $nom_table1 WHERE id LIKE '" $lignes3"'"
        Requete a executer = $sql06
        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
        echo "------ Fin test 6 -----"
        echo ""
        echo "resultat requête sql06 : $sql06"

        il m'affiche
        /home/serveur/Domotique/ordres/e-lall-on: line 255: ' : commande introuvable
        /home/serveur/Domotique/ordres/e-lall-on: line 256: Requete : commande introuvable


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


        Ligne 256
        Requete a executer = $sql06


        Merci.
        1. Contributeur
          Je répète : j'ai modifié mon post précédent ;-)

          Il faut mettre :

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

          echo "Requete a executer : " $sql06
      4. bonsoir,

        J'ai fait ceci :
        echo "------ test  6 -----"
        sql06="SELECT $select_noms_colonnes1_2 FROM $nom_table1 WHERE id LIKE '" $lignes3%"'" 
        Requete a executer = $sql06
        
        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
        echo "------ Fin test 6 -----"
        echo ""
        echo "resultat sql06 : $sql06"


        Il me repond :
        ------ test  6 -----
        /home/serveur/Domotique/ordres/e-lall-on: line 254: fg: pas de contrôle de tâche
        /home/serveur/Domotique/ordres/e-lall-on: line 255: Requete : commande introuvable
        ------ Fin test 6 -----


        Ligne 254 :

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


        Ligne 255 :

        Requete a executer = $sql06


        Merci.
        1. Contributeur
          J'ai modifié mon post, effectivement c'était pas bon ;-)

          A force de maniper sur plusieurs langages, on se perd :-)
      5. Contributeur
        Dans ce cas essayez ainsi :

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

        Et rajouter en dessous :

        echo "Requete a executer : "$sql06

        Voir quelle requête sera exécutée.

        Le loup, solitaire et mystérieux.
        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. 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,

              ç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
                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,

                  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. 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. Contributeur
                      Z'auriez pas oublié cela par hasard ? :-)

                      --default-character-set=$format_texte

                      Comme vous l'aviez mis auparavant.
                      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
                          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,

                            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. 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

                                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. 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
                                  • 2