Précédent   Forum des professionnels en informatique > Bases de données > MySQL
MySQL Forum d'entraide MySQL. Avant de poster -> FAQ MySQL, Tutoriels MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 19/01/2011, 11h09   #1
Membre du Club
 
Homme KONE
Inscription : juin 2004
Messages : 109
Détails du profil
Informations personnelles :
Nom : Homme KONE
Localisation : Côte d'Ivoire

Informations professionnelles :
Secteur : Service public

Informations forums :
Inscription : juin 2004
Messages : 109
Points : 43
Points : 43
Par défaut Requete sur un champ contenant plusieurs valeurs

Bonjour. je fais un site web, ou je demande aux visiteurs leurs passe-temps. Plusieurs choix sont possibles.
Les modalites sont par exemple:

choix1: Tele
Choix2: Plage
Choix3: Restaurant
Choix4: Famille
Choix5: Amis

Si le visiteur coche un choix, cela est representé par 1 et 0 sinon. Par exemple s'il fait les choix 2-3-5 j'encode sa reponse comme choix=01101. Ensuite j'utilise la fonction bindec("01101"). Dans ma base j'ai un seul champ choix ou j'enregistre bindec("01101") par exemple 623.

je veux faire une requete sql pour selectionner les visiteurs aimant la plage (choix2) et les restaurants (choix3). Je ne sais vraiment pas quelle requete ecrire qui puisse selectionner ces membres.

Merci de bien vouloir me donner un coup de main.
__________________
Une somme de savoirs en chaque matière, si minime soit-elle, rend n'importe quel benêt, dans un pays de benêts, docte.
ecarbill est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/01/2011, 16h27   #2
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 986
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 10 986
Points : 18 234
Points : 18 234
Envoyer un message via MSN à CinePhil
Une base de données n'est pas un tableur !

Si plus tard tu ajoutes des choix, tu dois revoir ton code, avec tous les risques d'erreur que cela comporte.

Tu devrais avoir le MCD suivant :
Visiteur -0,n----Avoir----0,n- Passe-temps

Ce qui engendrera 3 tables :
Visiteur (vis_id, vis_nom...)
Passe_temps (pst_id, pst_libelle)
Avoir (avr_id_visiteur, avr_id_passe_temps)

Venons-en à ton besoin :
Citation:
selectionner les visiteurs aimant la plage (choix2) et les restaurants (choix3)
Il suffit de sélectionner les visiteur ayant pour passe-temps la plage ou le restaurant et ayant ces deux critères.
Code :
1
2
3
4
5
6
7
SELECT v.vis_id, v.vis_nom
FROM visiteur v
INNER JOIN avoir a ON a.avr_id_visiteur = v.vis_id
    INNER JOIN passe_temps p ON p.pst_id = a.avr_id_passe_temps
WHERE p.pst_libelle IN ('Plage', 'Restaurant')
GROUP BY v.vis_id, v.vis_nom
HAVING COUNT(*) = 2
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/01/2011, 12h00   #3
Membre du Club
 
Homme KONE
Inscription : juin 2004
Messages : 109
Détails du profil
Informations personnelles :
Nom : Homme KONE
Localisation : Côte d'Ivoire

Informations professionnelles :
Secteur : Service public

Informations forums :
Inscription : juin 2004
Messages : 109
Points : 43
Points : 43
Merci CinePhil pour ta suggestion qui m'a été très utile. J'ai créé les tables.

Mais dans l'exemple de requete que tu m'a proposé, je ne comprend pas la dernière partie:

Si je peux avoir une petite explication. Merci d'avance
__________________
Une somme de savoirs en chaque matière, si minime soit-elle, rend n'importe quel benêt, dans un pays de benêts, docte.
ecarbill est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/01/2011, 13h59   #4
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 986
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 10 986
Points : 18 234
Points : 18 234
Envoyer un message via MSN à CinePhil
HAVING est un WHERE qui agit sur le résultat d'un regroupement.

Quelqu'un qui aime à la fois la plage et le restaurant aura deux lignes de résultat sans le GROUP BY. L'idée est donc de regrouper par visiteur et de compter ces lignes. Comme il y a deux passe-temps à prendre en compte et qu'on veut ne conserver que ceux qui aiment à la fois la plage et le restaurant, il faut donc que le comptage des lignes soit de deux.

Je reprends ma structure :
Citation:
Visiteur (vis_id, vis_nom...)
Passe_temps (pst_id, pst_libelle)
Avoir (avr_id_visiteur, avr_id_passe_temps)
Je peuple les tables de quelques lignes...
Visiteur (vis_id, vis_nom...)
1, ecarbill
2, CinéPhil
3, GrosBill
4, PetiteFleur

Passe_temps (pst_id, pst_libelle)
1, Télé
2. Plage
3, Restaurant
4, Famille
5, Amis

Avoir (avr_id_visiteur, avr_id_passe_temps)
1, 2
1, 3
1, 4
2, 2
2, 3
2, 4
2, 5
3, 1
3, 2
4, 2
4, 5

Exécutons la requête sans condition ni groupement :
Code :
1
2
3
4
SELECT v.vis_id, v.vis_nom, p.pst_libelle
FROM visiteur v
INNER JOIN avoir a ON a.avr_id_visiteur = v.vis_id
    INNER JOIN passe_temps p ON p.pst_id = a.avr_id_passe_temps
=> Résultat
1, ecarbill, Plage
1, ecarbill, Restaurant
1, ecarbill, Famille
2, CinéPhil, Plage
2, CinéPhil, Restaurant
2, CinéPhil, Famille
2, CinéPhil, Amis
3, GrosBill, Télé
3, GrosBill, Plage
4, PetiteFleur, Plage
4, PetiteFleur, Amis

Ajoutons le WHERE :
Code :
1
2
3
4
5
SELECT v.vis_id, v.vis_nom, p.pst_libelle
FROM visiteur v
INNER JOIN avoir a ON a.avr_id_visiteur = v.vis_id
    INNER JOIN passe_temps p ON p.pst_id = a.avr_id_passe_temps
WHERE p.pst_libelle IN ('Plage', 'Restaurant')
=> Résultat :
1, ecarbill, Plage
1, ecarbill, Restaurant
2, CinéPhil, Plage
2, CinéPhil, Restaurant
3, GrosBill, Plage
4, PetiteFleur, Plage

On voit que ceux qui répondent aux 2 critères ont 2 ligne de résultat.
Ajoutons le comptage et le GROUP BY :
Code :
1
2
3
4
5
6
SELECT v.vis_id, v.vis_nom, COUNT(*) AS nb_lignes
FROM visiteur v
INNER JOIN avoir a ON a.avr_id_visiteur = v.vis_id
    INNER JOIN passe_temps p ON p.pst_id = a.avr_id_passe_temps
WHERE p.pst_libelle IN ('Plage', 'Restaurant')
GROUP BY v.vis_id, v.vis_nom
=> Résultat :
1, ecarbill, 2
2, CinéPhil, 2
3, GrosBill, 1
4, PetiteFleur, 1

Ajoutons le HAVING :
Code :
1
2
3
4
5
6
7
SELECT v.vis_id, v.vis_nom, COUNT(*) AS nb_lignes
FROM visiteur v
INNER JOIN avoir a ON a.avr_id_visiteur = v.vis_id
    INNER JOIN passe_temps p ON p.pst_id = a.avr_id_passe_temps
WHERE p.pst_libelle IN ('Plage', 'Restaurant')
GROUP BY v.vis_id, v.vis_nom
HAVING COUNT(*) = 2
=> Résultat :
1, ecarbill, 2
2, CinéPhil, 2
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/01/2011, 14h06   #5
Membre du Club
 
Homme KONE
Inscription : juin 2004
Messages : 109
Détails du profil
Informations personnelles :
Nom : Homme KONE
Localisation : Côte d'Ivoire

Informations professionnelles :
Secteur : Service public

Informations forums :
Inscription : juin 2004
Messages : 109
Points : 43
Points : 43
Merci beaucoup CinePhil. Ton explication est très claire et j'ai bien compris.

Excellente journée à toi
__________________
Une somme de savoirs en chaque matière, si minime soit-elle, rend n'importe quel benêt, dans un pays de benêts, docte.
ecarbill est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 01h15.


 
 
 
 
Partenaires

Hébergement Web