IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Comment utiliser IN pour filtrer un champ [MySQL]


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 165
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 165
    Par défaut Comment utiliser IN pour filtrer un champ
    Bonjour à tous

    Dans un précédent post, on m'a donné cette astuce que je ré-exploite ci-dessous

    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $and = " AND stype.sensor_type_name IN ( 1,2,3,4) ";
    pour comparer si des ID existent par enregistrement.

    Actuellement, j'essaye de faire la même chose mais un peu différemment, car ce n'est pas des ID que je veux vérifier, mais le nom des types de capteurs. Soit des noms...

    J'ai ceci qui va me retoruner les capteurs existants (ou enregistrés) pour une station. Il doit en avoir 12...
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    $sql_select = 'SELECT se.id_sensor, stype.sensor_type_name FROM stations AS sa
                        LEFT JOIN sensors AS se ON sa.id_station = se.stations_id_station
                        LEFT JOIN sensor_types AS stype ON se.sensor_types_id_sensor_type = stype.id_sensor_type
                        WHERE se.stations_id_station = "'.$station_id.'" 
     
                        ORDER BY se.stations_id_station ASC';
     
        $sql_result = $connect->query($sql_select);
     
      while($row = $sql_result->fetch_assoc()){
     
            // Construct the array with available sensors for the selected station
            foreach($row as $a => $aa){
                if($a=="id_sensor"){
                    $index = $aa;
                    //$sens[$aa]=$aa;
                }
                 if($a=="sensor_type_name"){
                    $sens[$index]=$aa;
                }
     
            }
        }
     
        print_r($sens);
     
    }
    Si j'ai deux capteurs enregistrée, il me retorune ceci (pour la station 2, j'en ai enregistré 2)

    Array ( [13] => wl [14] => wln )
    si tous les capteurs (soit 12) sont enregistrés dans la base de donnée, il me retourne ceci (pour la station 1, j'en ai enregistré 12)
    [QUOTE]
    Array ( [1] => wl [2] => wln [3] => hfs [4] => hfb [5] => ta [6] => ts [7] => t30mm [8] => t60mm [9] => t100m [10] => t200m [11] => t500mm [12] => t1200mm )
    [/CODE]
    A savoir que l'index de mon array '$sens' représente l'ID de mon capteur. La valeur de '$sens' représente le type du capteur...

    Mon objectif et de vérifier qu'il y a bien 12 différents capteurs enregistrés pour une station et d'indiqué quel est (ou sont) le capteur manquant.
    Donc pour la station1, le script peut continuer.
    En revanche pour la station 2, le script doit s'arreter.

    La liste des types de capteurs est la suivante
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $check_sensor_type='wl,wln,hfs,hfb,ta,ts,t30mm,t60mm,t100mm,t200mm,t500mm,t1200mm';


    J'ai donc essayé ceci:
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
        $sql_select = 'SELECT se.id_sensor, stype.sensor_type_name FROM stations AS sa
                        LEFT JOIN sensors AS se ON sa.id_station = se.stations_id_station
                        LEFT JOIN sensor_types AS stype ON se.sensor_types_id_sensor_type = stype.id_sensor_type
                        WHERE se.stations_id_station = "'.$station_id.'" 
                        AND stype.sensor_type_name IN ('.$check_sensor_type.')
                        ORDER BY se.stations_id_station ASC';
     
        $sql_result = $connect->query($sql_select);
     
     
        while($row = $sql_result->fetch_assoc()){
     
            // Construct the array with available sensors for the selected station
            foreach($row as $a => $aa){
                if($a=="id_sensor"){
                    $index = $aa;
                    //$sens[$aa]=$aa;
                }
                 if($a=="sensor_type_name"){
                    $sens[$index]=$aa;
                }
     
            }
        }
     
        print_r($sens);
    mais ceci me retorune ce message d'erreur
    Fatal error: Uncaught Error: Call to a member function fetch_assoc() on boolean
    et ce message erreur faire référence à cette ligne
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    while($row = $sql_result->fetch_assoc()){
    ce qui me laisse coire que ma requête SELECT ne me retourne rien du tout.

    Je me demande donc 1) si j'utilise correctement le IN et si il ne peut être utiliser que pour comparer des ID

    Si non comment arriver à mon but?

    Milles mercis pour vos lumières

  2. #2
    Membre Expert Avatar de vttman
    Homme Profil pro
    Développeur "couteau mosellan"
    Inscrit en
    Décembre 2002
    Messages
    1 140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur "couteau mosellan"
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 140
    Par défaut
    ça manque de ' ou " ?

    Essayer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $check_sensor_type="'wl','wln','hfs','hfb','ta','ts','t30mm','t60mm','t100mm','t200mm','t500mm','t1200mm'";
    Avec ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    $sql_select = "SELECT se.id_sensor, stype.sensor_type_name FROM stations AS sa
                        LEFT JOIN sensors AS se ON sa.id_station = se.stations_id_station
                        LEFT JOIN sensor_types AS stype ON se.sensor_types_id_sensor_type = stype.id_sensor_type
                        WHERE se.stations_id_station = '".$station_id."' 
                        AND stype.sensor_type_name IN (".$check_sensor_type.")
                        ORDER BY se.stations_id_station ASC";
    Suggestion : Afficher le contenu de $sql_select (echo) avant exécution puis copier/coller directement sous Mysql pour être sûr que la requête est OK ...

  3. #3
    Membre Expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 59
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Billets dans le blog
    8
    Par défaut
    Fais ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    echo $sql_select;
    break;
    puis Teste le SQL qui s'affiche dans phpmyadmin direct !
    Ca te dira où ça coince...
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

  4. #4
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Par défaut
    Bonjour,

    1- Ne concatène pas tes variables directement dans la requête mais utilise une requête préparée.
    2- J'ai remarqué que tu utilise systématiquement LEFT JOIN dans toutes tes requêtes, or dans ce cas c'est simple JOIN qu'il te faut.
    3- Tu faits des jointures inutiles avec la table stations.

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT se.id_sensor, stype.sensor_type_name FROM sensors AS se 
                        JOIN sensor_types AS stype ON se.sensor_types_id_sensor_type = stype.id_sensor_type
                        WHERE se.stations_id_station = ? 
                        AND stype.sensor_type_name IN (?)
                        ORDER BY se.stations_id_station ASC

    A+.

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 165
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 165
    Par défaut
    Merci beaucoup pour cette information qui apparemment est super importante.

    Si j'ai bien compris

    LEFT JOIN, va me retoruner toutes les valeurs de gauche et les valeurs de la colonne de droite qui correspondent
    https://www.w3schools.com/sql/sql_join_left.asp

    JOIN et INNER JOIN c'est la même chose. Elle va me retourner toutes les valeurs de gauche qui corresponde à la table de droite.
    https://blog.codinghorror.com/a-visu...-of-sql-joins/

    Donc on est d'accord que si dans ma table de gauche, j'ai des fruits et des legumes avec une colone qui va identifié le type d'aliment (1 pour fruits, 2 pour legume). Si dans ma table de droite je definis les types d'aliment

    ID -- id_type -- name
    1 -- 1 -- pomme
    2 -- 1 -- poire
    3 -- 1 -- peche
    4 -- 2 -- carrotte

    ID----- name
    1 ----- fruit
    2 ----- legume
    et que je fais un INNER JOIN sur aliments.id_type et type,id ou id_type est egal à 1, il va me retourner pomme, poire, peche et fruit.

    Si je fais LEFT JOIN sur aliments.id_type et type,id ou id_type est egal à 1, il va me retourner pomme, poire, peche, carrotte et fruit.

    Parce qu'en effet, avec mon LEFT JOIN, j'aurai une grande quantitée de donnée

    On est d'accord?

    Milles mercis

  6. #6
    Invité
    Invité(e)
    Par défaut
    1-
    ...ce n'est pas des ID que je veux vérifier, mais le nom des types de capteurs...
    C'est là où tu as TOUT FAUX.

    Si tu n'utilises pas les id, c'est que ton code est MAL CONÇU.
    Ca aussi, on te l'a déjà dit.

    N.B. Un "nom" peut se modifier à volonté dans 1 table, sur 1 ligne... sans être répercuté dans les autres.
    Alors qu'un id, non.

    2- Quant à RIGHT / LEFT JOIN, ce qu'il faut retenir :
    • RIGHT JOIN : retourne les lignes de la table (de gauche, la principale) qui ont FORCEMENT un lien (jointure) avec celle de droite
    • LEFT JOIN : retourne les lignes de la table (de gauche, la principale) même si elles N'ONT PAS FORCEMENT un lien (jointure) avec celle de droite

    Généralement, on cherche les lignes qui ont des correspondances dans les DEUX tables : INNER JOIN.
    Dernière modification par Invité ; 07/03/2018 à 20h41.

  7. #7
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 165
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 165
    Par défaut
    Salut jreaux62
    Oui tu as raison.
    Je propose qu'on ferme ce sujet.
    Car quand je l'ai ouvert, je cherchais à solution un sujet sur le IN. Entre temps, j'ai fait autrement et maintenant je reboudit sur les jointures.
    Donc ce sujet ne suit plus la même direction et j'ai compris pourquoi ca buggait au niveau du IN.
    OK?

    Merciiii


    PS: A l'exception de ce cas là, j'avais déjà tout corrigé pour travailler avec les ID, comme tu me l'as recommander

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 05/12/2012, 10h49
  2. comment utiliser "Distinct" pour une requete mysql
    Par Emilie012 dans le forum Requêtes
    Réponses: 4
    Dernier message: 30/10/2008, 21h03
  3. Comment utiliser QtSql pour communiquer avec un serveur MySQL ?
    Par sebatlante dans le forum Bases de données
    Réponses: 8
    Dernier message: 10/06/2008, 14h34
  4. Réponses: 4
    Dernier message: 18/05/2006, 09h20
  5. Réponses: 2
    Dernier message: 27/04/2006, 16h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo