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

Langage SQL Discussion :

Requête multicritère sur une même table


Sujet :

Langage SQL

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2010
    Messages : 5
    Points : 5
    Points
    5
    Par défaut Requête multicritère sur une même table
    Bonjour,
    je rencontre quelques soucis avec l'exécution d'une requête SQL. Je vais tenter d'illustrer ça simplement :

    On a une table "Animaux" qui contient les champs suivants :
    - idAnimal
    - le type de l'animal (chien, chat...)
    - le prénom de l'animal

    reliée à une table "Personne" (via une table d'association)
    - idPersonne
    - nom
    - prénom

    NB : Une personne peut posséder un ou plusieurs animaux

    Je souhaite créer un formulaire de recherche avec un champ par type d'animaux. L'utilisateur devra entrer le nom de l'animal. Par exemple, si l'utilisateur a entré :
    - chat : Félix
    - chien : Milou
    le résultat de la recherche doit renvoyer le nom de la personne qui possèdes le chat Félix ET le chien Milou.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT Personne.nom, Personne.prenom	
    FROM ((personne LEFT JOIN Personne_Animal ON Personne.idPersonne = Personne_Animal.idPersonne) LEFT JOIN Animal ON  Personne_Animal.idAnimal = Animal.idAnimal)
    WHERE ((Animal.nom = $nom_chat) AND Animal.nom = $nom_chien)
    Le problème se situe dans le WHERE mais après avoir essayé pas mal de choses, je ne vois pas du tout comment résoudre ce problème, à part peut-être en créant une table par type d'animaux... Mais j'aimerais autant trouver une autre solution ^^

    J'espère avoir été claire,
    merci d'avance pour vos réponses

  2. #2
    Membre expérimenté Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Points : 1 738
    Points
    1 738
    Par défaut
    Enlevez toutes vos parentheses qui ne vous servent a rien.
    Pourquoi utilisez vous une jointure externe, puisque vous voulez trouver les personnes ayant un animal ?

    Quel est le soucis exact de l'execution de votre requete (syntaxe, retour different de l'attente, ...) ?
    Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)

  3. #3
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2010
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    Merci pour la réponse rapide, je rectifie pour les jointures externes et parenthèses.

    Le souci c'est que le résultat renvoyé n'est pas le bon.
    Par exemple Pierre possède le chat Félix et le chien Milou.

    Lors de la recherche via le formulaire
    si je renseigne uniquement le champ chat : Félix, le résultat affiche Pierre
    si je renseigne uniquement le champ chien : Milou, le résultat affiche Pierre
    si je remplis les 2 champs
    - chat : Félix
    - chien : Milou
    la recherche ne renvoie aucun résultat...

    Je pense qu'il y a un conflit étant donné que je recherche 2 noms d'animaux différents pour une même personne. Peut-être avec un système de sous-requête ? Mais je ne suis pas du tout sûre de moi, et ce que j'ai testé jusque là n'a pas fonctionné

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Bonjour,

    Vous pouvez remplacer le AND de votre filtre par un OR pour récupérer les lignes satisfaisant les deux conditions, puis ne conservez que les noms qui satisfont les deux avec une clause HAVING :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT Personne.nom, Personne.prenom	
    FROM personne 
    LEFT JOIN Personne_Animal ON Personne.idPersonne = Personne_Animal.idPersonne 
    LEFT JOIN Animal ON Personne_Animal.idAnimal = Animal.idAnimal
    WHERE Animal.nom = $nom_chat OR Animal.nom = $nom_chien
    GROUP BY Personne.nom, Personne.prenom
    HAVING count(*) >= 2

  5. #5
    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 032
    Points
    34 032
    Billets dans le blog
    14
    Par défaut
    C'est effectivement ici qu'il y a problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE ((Animal.nom = $nom_chat) AND Animal.nom = $nom_chien)
    Un animal ne peut pas avoir deux noms à la fois !

    Il faut donc :
    - utiliser IN suivi de la liste des noms ;
    - compter le nombre d'animaux possédés par personne ;
    - ne garder que les personnes dont le nombre d'animaux correspond au nombre de noms.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT p.nom, p.prenom    
    FROM personne p
    INNER JOIN Personne_Animal pa ON p.idPersonne = pa.idPersonne 
        INNER JOIN Animal a ON  pa.idAnimal = a.idAnimal
    WHERE a.nom IN('$nom_chat', '$nom_chien')
    GROUP BY p.nom, p.prenom
    HAVING COUNT(a.idAnimal) >= 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 !

  6. #6
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2010
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    En réalité ma requête est plus importante : je sélectionne auparavant d'autres informations, le HAVING count ne peut donc pas être utilisé ici.
    Après quelques recherches je pense créer plusieurs requêtes et recouper les informations à l'aide d'un array_intersect().

    array array_intersect ( array $array1 , array $array2 [, array $ ... ] )
    array_intersect() retourne un tableau contenant toutes les valeurs de array1 qui sont présentes dans tous les autres arguments array2, ..., etc. Notez que les clés sont préservées.

    Merci tout de même pour vos réponses

  7. #7
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Citation Envoyé par M31ani3 Voir le message
    En réalité ma requête est plus importante : je sélectionne auparavant d'autres informations, le HAVING count ne peut donc pas être utilisé ici.
    Pourquoi donc ?
    Une sous-requête + jointure devrait suffire non ?

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

Discussions similaires

  1. Requête de doublons sur une même table
    Par Swenn dans le forum SQL
    Réponses: 2
    Dernier message: 20/06/2013, 09h36
  2. Requête imbriquée sur une même table
    Par Bluesman72 dans le forum Oracle
    Réponses: 1
    Dernier message: 02/05/2012, 09h37
  3. Requête conditionnelle sur une même table
    Par grafistolage dans le forum Langage SQL
    Réponses: 9
    Dernier message: 14/02/2010, 23h49
  4. Réponses: 1
    Dernier message: 08/09/2006, 15h56
  5. jointure sur une même table
    Par guillaumeVb6 dans le forum Langage SQL
    Réponses: 7
    Dernier message: 06/09/2004, 15h08

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