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 :

Requete sur un champ contenant plusieurs valeurs


Sujet :

Requêtes MySQL

  1. #1
    Membre habitué Avatar de ecarbill
    Homme Profil pro
    Cyberdocumentaliste
    Inscrit en
    Juin 2004
    Messages
    225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Cyberdocumentaliste
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2004
    Messages : 225
    Points : 146
    Points
    146
    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.

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    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 799
    Points : 34 046
    Points
    34 046
    Billets dans le blog
    14
    Par défaut
    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 :
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 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
    Membre habitué Avatar de ecarbill
    Homme Profil pro
    Cyberdocumentaliste
    Inscrit en
    Juin 2004
    Messages
    225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Cyberdocumentaliste
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2004
    Messages : 225
    Points : 146
    Points
    146
    Par défaut
    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.

  4. #4
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    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 799
    Points : 34 046
    Points
    34 046
    Billets dans le blog
    14
    Par défaut
    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 :
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 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
    Membre habitué Avatar de ecarbill
    Homme Profil pro
    Cyberdocumentaliste
    Inscrit en
    Juin 2004
    Messages
    225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Cyberdocumentaliste
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2004
    Messages : 225
    Points : 146
    Points
    146
    Par défaut
    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.

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

Discussions similaires

  1. [AC-2007] Requete sur un champ multi-valeur
    Par Doutrick dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 17/06/2013, 04h32
  2. Champs contenant plusieurs valeurs séparées par ;
    Par sabine34 dans le forum Requêtes
    Réponses: 3
    Dernier message: 11/05/2007, 12h20
  3. Requete sur un champ reference
    Par kirty dans le forum Bases de données
    Réponses: 8
    Dernier message: 05/08/2006, 16h11
  4. Optimisation d'une requete sur un champ texte
    Par TARMINE dans le forum Langage SQL
    Réponses: 1
    Dernier message: 07/06/2006, 13h41
  5. requete sur un champs text
    Par sam01 dans le forum Requêtes
    Réponses: 1
    Dernier message: 10/03/2006, 13h41

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