Précédent   Forum du club des développeurs et IT Pro > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 14/12/2012, 13h35   #1
Thebaloo
Invité régulier
 
cyril menigoz
Ingénieur Infotronique : sécurité qualité et architecture réseaux
Inscription : février 2010
Messages : 40
Détails du profil
Informations personnelles :
Nom : cyril menigoz
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 : 40
Points : 8
Points : 8
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 :
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 :
 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 :
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
Thebaloo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2012, 14h03   #2
CinePhil
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 13 659
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 49
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 : 13 659
Points : 25 561
Points : 25 561
Envoyer un message via MSN à CinePhil
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 :
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 de Formation Agronomique. Autoentrepreneur.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 10
Vieux 14/12/2012, 14h34   #3
Thebaloo
Invité régulier
 
cyril menigoz
Ingénieur Infotronique : sécurité qualité et architecture réseaux
Inscription : février 2010
Messages : 40
Détails du profil
Informations personnelles :
Nom : cyril menigoz
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 : 40
Points : 8
Points : 8
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 :
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
Thebaloo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2012, 15h34   #4
CinePhil
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 13 659
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 49
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 : 13 659
Points : 25 561
Points : 25 561
Envoyer un message via MSN à CinePhil
Sur ton dernier exemple de données et la liste à comparer, tu peux faire cette requête :
Code :
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 de Formation Agronomique. Autoentrepreneur.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2012, 16h28   #5
Thebaloo
Invité régulier
 
cyril menigoz
Ingénieur Infotronique : sécurité qualité et architecture réseaux
Inscription : février 2010
Messages : 40
Détails du profil
Informations personnelles :
Nom : cyril menigoz
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 : 40
Points : 8
Points : 8
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 :
Thebaloo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2012, 16h35   #6
CinePhil
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 13 659
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 49
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 : 13 659
Points : 25 561
Points : 25 561
Envoyer un message via MSN à CinePhil
Donne ta requête.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Autoentrepreneur.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2012, 02h04   #7
Thebaloo
Invité régulier
 
cyril menigoz
Ingénieur Infotronique : sécurité qualité et architecture réseaux
Inscription : février 2010
Messages : 40
Détails du profil
Informations personnelles :
Nom : cyril menigoz
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 : 40
Points : 8
Points : 8
Code :
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
Thebaloo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2012, 11h16   #8
ericd69
Expert Confirmé
 
Avatar de ericd69
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 1 802
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
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 802
Points : 3 096
Points : 3 096
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...
ericd69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2012, 11h19   #9
CinePhil
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 13 659
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 49
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 : 13 659
Points : 25 561
Points : 25 561
Envoyer un message via MSN à CinePhil
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 :
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 de Formation Agronomique. Autoentrepreneur.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2012, 10h44   #10
Thebaloo
Invité régulier
 
cyril menigoz
Ingénieur Infotronique : sécurité qualité et architecture réseaux
Inscription : février 2010
Messages : 40
Détails du profil
Informations personnelles :
Nom : cyril menigoz
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 : 40
Points : 8
Points : 8
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
Thebaloo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2012, 10h47   #11
ericd69
Expert Confirmé
 
Avatar de ericd69
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 1 802
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
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 802
Points : 3 096
Points : 3 096
à 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...
ericd69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 16h06.


 
 
 
 
Partenaires

Hébergement Web