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

Requêtes MySQL Discussion :

Selection à partir d'une liste et renvoyant une liste


Sujet :

Requêtes MySQL

  1. #1
    Nouveau membre du Club
    Profil pro
    Ingénieur Infotronique : sécurité qualité et architecture réseaux
    Inscrit en
    Février 2010
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Infotronique : sécurité qualité et architecture réseaux
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2010
    Messages : 47
    Points : 33
    Points
    33
    Par défaut Selection à partir d'une liste et renvoyant une liste
    Bonjour,
    J'essaye de développer un programme de localisation sur les adresses mac des box alentours.

    Voici la structure de mes tables :
    Code : 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
     
    WifiPrint
    +--------------+---------+------+-----+---------+----------------+
    | Field        | Type    | Null | Key | Default | Extra          |
    +--------------+---------+------+-----+---------+----------------+
    | ID_WifiPrint | int(11) | NO   | PRI | NULL    | auto_increment |
    | BSSID        | text    | NO   |     | NULL    |                |
    | RSSI         | int(11) | NO   |     | NULL    |                |
    | Id_Scan      | int(11) | YES  | MUL | NULL    |                |
    +--------------+---------+------+-----+---------+----------------+
     
    +-----------+-----------+------+-----+-------------------+---------------
    | Field     | Type      | Null | Key | Default           | Extra                       |
    +-----------+-----------+------+-----+-------------------+---------------
    | ID_Scan   | int(11)   | NO   | PRI | NULL              | auto_increment              |
    | Longitude | double    | NO   |     | NULL              |                             |
    | Latitude  | double    | NO   |     | NULL              |                             |
    | Altitude  | double    | NO   |     | NULL              |                             |
     
    +-----------+-----------+------+-----+-------------------+---------------
    J'aimerais savoir comment je peux faire une sélection a partir d'une liste de WifiPrint.BSSID,
    à un moment T, je capte 5 box et je veux pouvoir demander à ma base de donner de me donné l'enregistrement commun à ces 5 box.
    je ne peux utiliser une clause "and" basique ( logique ) donc j'ai essayé une requête combinant un select pour chaque élément que je cherche à avoir:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     select * from wifiprint , scan where wifiprint.Id_Scan = Scan.ID_Scan and (Select id_scan from WifiPrint where wifiprint.BSSID like '%38:46:08:dc:6e:8e%')  and (Select id_scan from wifiprint where wifiprint.BSSID like '%c0:3f:0e:c7:c8:f4%') ;
    ce qui m'a retourné :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ERROR 1242 (21000): Subquery returns more than 1 row
    mais justement, je veux qu'il m'en retourne plusieurs, puisque je veux ensuite pouvoir trier en fonction de la qualité du signal et peut être même d'autre paramètres.

    D'avance Merci

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 793
    Points : 34 024
    Points
    34 024
    Billets dans le blog
    14
    Par défaut
    1) Les jointures s'écrivent depuis 20 ans avec l'opérateur JOIN ; il serait temps de s'y mettre !

    2) L'utilisation d'alias pour les tables est fortement recommandé dès qu'il y a plus d'une table dans la requête. Cela facilite l'écriture et la lecture de celle-ci. Il faut ensuite utiliser systématiquement ces alias devant chaque colonne nommée pour savoir facilement de quelle table elle vient.

    3) Il vaut mieux éviter la guerre des étoiles !

    4) Pas sûr d'avoir compris ton besoin. Un jeu de données et le résultat attendu aiderait à la compréhension.
    Cette requête conviendrait-elle ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT id_scan
    FROM wifiprint w
    INNER JOIN scan  s ON w.Id_Scan = s.ID_Scan
    WHERE w.BSSID LIKE '%38:46:08:dc:6e:8e%'
    	OR w.BSSID LIKE '%c0:3f:0e:c7:c8:f4%'
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Nouveau membre du Club
    Profil pro
    Ingénieur Infotronique : sécurité qualité et architecture réseaux
    Inscrit en
    Février 2010
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Infotronique : sécurité qualité et architecture réseaux
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2010
    Messages : 47
    Points : 33
    Points
    33
    Par défaut
    Tout d'abord merci de ta rapidité

    1) en effet, je n'ai pas forcément l'habitude d'en faire, je vais corriger

    2) idem

    3) sur le coup j'avoue que c'est de la fainéantise, mais j'allais le faire ensuite, ne serais qu'a cause de la taille de ma table

    4) En faite c'est le principe d'empreinte : je veux un maximum de concordance entre une liste et le résultat d'un select ( qui correspond du coup à un identifiant dans mon cas Id_Scan )
    en voici un ( j’abrège un max la valeur des données, une base comme celle que je fais contiendra à terme des centaines de milliers de tuple )

    données
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    BSSID | Id_Scan
    1 | 20
    2 | 20
    5 | 20 
    15  | 20
    45 | 20
     
    1 | 21
    4 | 21
    6 | 21 
    15  | 21
    45 | 2
    en envoyant 1,2,5 ,14,45 j'aimerais avoir la ligne qui correspond à mon Id_Scan de 20 dans la bonne table du coup.

    Je suis entrain de me rendre compte qu'il y a peut être une solution plus optimal pour faire une telle recherche

  4. #4
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 793
    Points : 34 024
    Points
    34 024
    Billets dans le blog
    14
    Par défaut
    Sur ton dernier exemple de données et la liste à comparer, tu peux faire cette requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT id_scan, COUNT(*) AS nombre
    FROM wifiprint
    WHERE BSSID IN (1, 2, 5, 14, 45)
    GROUP BY id_scan
    ORDER BY COUNT(*) DESC
    Elle cherche les id_scan qui ont au moins un BSSID parmi la liste fournir et compte combien il y a de BSSID de cette liste pour chaque id_scan en les classant du plus grand nombre au plus petit.
    Tu obtiens donc un classement de la meilleure concordance par rapport à liste vers la moins bonne.

    C'est facile en testant sur des valeurs exactes car on peut mettre la liste dans un IN mais ta première requête était avec des LIKE et là il faut faire la série de LIKE séparés par des OR, comme dans ma première requête.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  5. #5
    Nouveau membre du Club
    Profil pro
    Ingénieur Infotronique : sécurité qualité et architecture réseaux
    Inscrit en
    Février 2010
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Infotronique : sécurité qualité et architecture réseaux
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2010
    Messages : 47
    Points : 33
    Points
    33
    Par défaut
    Je n'obtiens aucune valeur, cela doit venir de la façon dont j'écris les éléments de la liste, avec le like j'ai vu qu'il fallait que je les écrive comme cela :

  6. #6
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 793
    Points : 34 024
    Points
    34 024
    Billets dans le blog
    14
    Par défaut
    Donne ta requête.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  7. #7
    Nouveau membre du Club
    Profil pro
    Ingénieur Infotronique : sécurité qualité et architecture réseaux
    Inscrit en
    Février 2010
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Infotronique : sécurité qualité et architecture réseaux
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2010
    Messages : 47
    Points : 33
    Points
    33
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT id_scan, COUNT(*) AS nombre
    FROM wifiprint
    WHERE BSSID IN ('%ca:a1:d7:43:ee:95%', '%c0:e1:a6:3a:cc:72%')
    GROUP BY id_scan
    ORDER BY COUNT(*) DESC

  8. #8
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    salut,

    attention si tu utilises in % n'est plus un caractère joker... comme dans like, tu dois utiliser les valeurs exactes
    soyons pensez à mettre quand votre problème est résolu ou à utiliser pour les réponses pertinentes...
    ne posez pas de problématique soi-disant simplifiée sur des problèmes que vous n'êtes pas capable de résoudre par respect pour ceux qui planchent dessus... sinon: et à utiliser pour insérer votre code...

  9. #9
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 793
    Points : 34 024
    Points
    34 024
    Billets dans le blog
    14
    Par défaut
    Comme dit plus haut, tu ne peux pas employer la syntaxe du LIKE dans le IN. Il faut faire la série de LIKE séparés par des OR.

    col IN (a, b) est équivalent à col = a OR col = b
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT id_scan, COUNT(*) AS nombre
    FROM wifiprint
    WHERE BSSID LIKE ('%ca:a1:d7:43:ee:95%')
      OR BSSID LIKE ('%c0:e1:a6:3a:cc:72%')
    GROUP BY id_scan
    ORDER BY COUNT(*) DESC
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  10. #10
    Nouveau membre du Club
    Profil pro
    Ingénieur Infotronique : sécurité qualité et architecture réseaux
    Inscrit en
    Février 2010
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Infotronique : sécurité qualité et architecture réseaux
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2010
    Messages : 47
    Points : 33
    Points
    33
    Par défaut
    Merci,
    Cela fonctionne parfaitement

    est ce que vous voulez que je mettes le bout de code java finale des fois que ça aide quelqu'un d'autre ? ( je bosse sur de l'android )


    Encore merci

  11. #11
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    à toi de voir
    soyons pensez à mettre quand votre problème est résolu ou à utiliser pour les réponses pertinentes...
    ne posez pas de problématique soi-disant simplifiée sur des problèmes que vous n'êtes pas capable de résoudre par respect pour ceux qui planchent dessus... sinon: et à utiliser pour insérer votre code...

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 03/06/2011, 01h42
  2. Réponses: 3
    Dernier message: 29/06/2007, 16h29
  3. Faire renvoyer une valeur 'true' par une methode ?
    Par patthepat dans le forum Ruby on Rails
    Réponses: 3
    Dernier message: 10/05/2007, 06h51
  4. liste déroulante avec une case à cocher et une image
    Par kurul1 dans le forum C++Builder
    Réponses: 4
    Dernier message: 08/03/2007, 10h54
  5. copie d'une table Y d'une base A vers une table X d'une base
    Par moneyboss dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 30/08/2005, 22h24

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