Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
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 09/09/2011, 16h24   #1
Invité de passage
 
Femme
Étudiant
Inscription : 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 : 2
Points : 2
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 :
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
M31ani3 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/09/2011, 16h32   #2
Membre Expert
 
Avatar de Yanika_bzh
 
Homme Yannick
Ingénieur Etudes & Developpements
Inscription : février 2006
Messages : 1 125
Détails du profil
Informations personnelles :
Nom : Homme Yannick
Localisation : France, Deux Sèvres (Poitou Charente)

Informations professionnelles :
Activité : Ingénieur Etudes & Developpements
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2006
Messages : 1 125
Points : 1 670
Points : 1 670
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)
Yanika_bzh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/09/2011, 16h47   #3
Invité de passage
 
Femme
Étudiant
Inscription : 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 : 2
Points : 2
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é
M31ani3 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/09/2011, 17h21   #4
Membre émérite
 
Inscription : août 2008
Messages : 835
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 835
Points : 823
Points : 823
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 :
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
Snipah est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/09/2011, 17h24   #5
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
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 : 11 029
Points : 18 327
Points : 18 327
Envoyer un message via MSN à CinePhil
C'est effectivement ici qu'il y a problème :
Citation:
Code :
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 :
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 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 26/09/2011, 15h05   #6
Invité de passage
 
Femme
Étudiant
Inscription : 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 : 2
Points : 2
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
M31ani3 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/09/2011, 15h13   #7
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 641
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 641
Points : 2 634
Points : 2 634
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 ?
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



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


 
 
 
 
Partenaires

Hébergement Web