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 28/01/2012, 00h11   #1
Invité de passage
 
Homme Maxence Noel
Student
Inscription : janvier 2012
Messages : 3
Détails du profil
Informations personnelles :
Nom : Homme Maxence Noel
Localisation : France, Morbihan (Bretagne)

Informations professionnelles :
Activité : Student
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : janvier 2012
Messages : 3
Points : 0
Points : 0
Par défaut Problème requêtes SQL

Bonjour à tous,

je travaille en ce moment sur un projet web, et je suis ici pour vous exposer mon problème.

J'ai trois tables:

ingredients: id_ingredient, nom_ingredient
recettes: id_recette, nom_recette
contenir: id_ingredient, id_recette

Mon problème est que je dois récupérer toutes les recettes qui comportent certains ingrédients. J'ai déjà travaillé ma requête de nombreuses fois mais je n'y arrive pas. Voila ce que j'ai trouvé.

Code :
1
2
3
4
5
6
SELECT nom_recette
FROM ingredients i, contenir c, recettes r
WHERE i.id_ingredient = c.id_ingredient
AND r.id_recette = c.id_recette
AND nom_ingredient = 'lait'
AND nom_ingredient = 'beurre'
La requête est opérationnelle mais ne renvoie pas de données.
Merci de venir à mon aide.
silitix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/01/2012, 20h19   #2
Membre régulier
 
Homme Francis Lennert
Développeur informatique
Inscription : novembre 2011
Messages : 52
Détails du profil
Informations personnelles :
Nom : Homme Francis Lennert
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : novembre 2011
Messages : 52
Points : 86
Points : 86
Hello

Il me semble que ton probleme provient du "AND" dans ta clause WHERE.

Ton ingrédient ne peut être en même temps du LAIT ET du Beurre.
Mon prénom est FRANCIS et donc ne peut pas être ERIC.

Mais un OR à la place ...

Code SQL :
1
2
3
4
5
6
7
 
SELECT nom_recette
FROM ingredients i, contenir c, recettes r
WHERE i.id_ingredient = c.id_ingredient
AND r.id_recette = c.id_recette
AND ( nom_ingredient = 'lait'
OR nom_ingredient = 'beurre' )



Bon weekend

Francis (qui n'est pas Eric)
Grandal est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/01/2012, 14h11   #3
Invité de passage
 
Homme Maxence Noel
Student
Inscription : janvier 2012
Messages : 3
Détails du profil
Informations personnelles :
Nom : Homme Maxence Noel
Localisation : France, Morbihan (Bretagne)

Informations professionnelles :
Activité : Student
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : janvier 2012
Messages : 3
Points : 0
Points : 0
Par défaut oui mais..

Bonjour Francis (qui n'est pas Eric )

Je comprends parfaitement ce que tu veux me dire, seulement je t'explique plus en détail:

je dois insérer plusieurs ingredients dans ma table ingredients qui correspondront à des recettes. CAD un ingredient pourra appartenir à 0 ou plusieurs recettes et un recette pourra avoir un ou plusieurs ingredients.

Je suis en train de créer un formulaire permettant aux utilisateurs d'ajouter des recettes à ma base de données. Seulement ils doivent entrer plusieurs ingredients dans le formulaire. Ces différents ingrédients devront être lié à leur recette.

En page principale, les utilisateurs pourront trouver des recettes en sélectionnant 4 ingrédients dans 4 listes déroulantes. C'est cette requête qui me pose problème. Je dois insérer les 4 ingredients dans la requête afin qu'il me trouve les recettes ayant ces 4 ingrédients, mais aussi trouver les recettes ayant seulement 3 ingrédients si l'utilisateur en a sélectionné que 3.

Je me demande même s'il est possible de faire ça avec SQL. Je devrais peut-être me pencher un peu plus sur mon php.
silitix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/01/2012, 10h36   #4
Membre confirmé
 
Homme
Développeur informatique
Inscription : octobre 2006
Messages : 181
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : octobre 2006
Messages : 181
Points : 267
Points : 267
Par défaut EXISTS

Bonjour,

Tu peux chercher l'existence d'un ingredient dans une recette ainsi :
Code :
1
2
3
4
5
6
7
SELECT nom_recette FROM recettes r
WHERE EXISTS 
(SELECT 1 FROM ingredients i, contenir c
 WHERE i.nom_ingredient = 'lait'
   AND c.id_ingredient  = i.id_ingredient
   AND c.id_recette     = r.id_recette
)
et multiplier les tests d'existence : and exists (...) and exists(...) ...
Jean.Cri1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/01/2012, 10h55   #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 331
Points : 18 331
Envoyer un message via MSN à CinePhil
Citation:
Je dois insérer les 4 ingredients dans la requête afin qu'il me trouve les recettes ayant ces 4 ingrédients,
C'est un problème classique déjà abordé maintes fois mais je reconnais que la formulation de la recherche n'est pas évidente pour trouver les discussions en rapport.

La table associative entre les ingrédients et les recettes comprend des couples {id_ingredient, id_recette}.
Une recette qui comporte 10 ingrédients aura donc 10 lignes dans la table associative.

L'utilisateur choisit une liste d'ingrédients et souhaite les recettes qui comportent tous ces ingrédients.

La requête doit donc sélectionner les lignes de la table associative dont l'ingrédient fait partie de la liste des ingrédients et ne retenir que les recettes dont le nombre de lignes dans la table associative (le nombre d'ingrédients) est égal au nombre d'éléments de la liste d'ingrédients choisis.

Code :
1
2
3
4
5
6
7
SELECT r.nom_recette
FROM recettes r
INNER JOIN contenir c ON c.id_recette = r.id_recette
	INNER JOIN ingredients i ON i.id_ingredient = c.id_ingredient
WHERE i.nom_ingredient IN ('lait', 'beurre')
GROUP BY r.nom_recette
HAVING COUNT(*) = 2 -- le nombre d'éléments dans la liste du IN
Au passage, note la syntaxe en vigueur depuis 20 ans pour les jointures !
__________________
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 31/01/2012, 21h43   #6
Invité de passage
 
Homme Maxence Noel
Student
Inscription : janvier 2012
Messages : 3
Détails du profil
Informations personnelles :
Nom : Homme Maxence Noel
Localisation : France, Morbihan (Bretagne)

Informations professionnelles :
Activité : Student
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : janvier 2012
Messages : 3
Points : 0
Points : 0
Par défaut problème requête sql

Bonjour CinePhil,

je comprends parfaitement ce que vous voulez me dire. Il reste seulement un petit détail que j'ai oublié d'énoncer dans la première partie. Il est important que les recettes affichées comportent le même nombre d'ingredient que la recette initiale. Je m'explique.

J'ai créer une première requête qui compte le nombre d'ingrédient par recette:

Code :
1
2
3
4
5
SELECT count(i.id_ingredient) nbre_ingredient_reel_dans_la_recette, name_recipe
FROM recipes r
INNER JOIN contain c ON c.id_recipe = r.id_recipe
	INNER JOIN ingredients i ON i.id_ingredient = c.id_ingredient
GROUP BY name_recipe
Cette requête fonctionne parfaitement et me renvoie le nombre d'ingrédient de chaque recette. Ensuite j'ai créé une seconde requête me permettant de connaitre le nombre d'ingredient que j'ai sélectionné au préalable et qui est présent dans les recettes retournées:

Code :
1
2
3
4
5
6
7
SELECT r.name_recipe, count(i.id_ingredient) AS nbre_ingredient_entree_faisant_parti_de_la_recette
FROM recipes r
INNER JOIN contain c ON c.id_recipe = r.id_recipe
	INNER JOIN ingredients i ON i.id_ingredient = c.id_ingredient
WHERE i.name_ingredient IN ('lait', 'oeuf')
GROUP BY r.name_recipe
HAVING COUNT(r.id_recipe) > 1
Cette dernière m'a été totalement inspiré par vous-même.
Le problème maintenant c'est qu'il me faut les recettes qui ont le même nombre d'ingrédient pour la première et le deuxième requête. CAD Je dois avoir au final les recettes contenant les ingrédients qu'on a au préalable entré mais qui (les recettes) ont le bon nombre d'ingrédient.

Je fais cela car je veux seulement récupérer le nom de recettes qui ont besoin seulement des ingrédients entrés et non pas les recettes qui comportent un des ingrédients entrés.

je pense qu'il y a peut être possibilité d'imbriquer les deux requêtes.

Merci pour vos réponses
silitix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2012, 23h43   #7
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 331
Points : 18 331
Envoyer un message via MSN à CinePhil
Je ne comprends pas tes explications !
Ma requête répondait, il me semble, au besoin exprimé qui était de trouver les recettes qui utilisent, par exemple, du lait ET de l'oeuf.

Citation:
Ensuite j'ai créé une seconde requête me permettant de connaitre le nombre d'ingredient que j'ai sélectionné au préalable et qui est présent dans les recettes retournées:
Sauf que ta requête groupe par r.name_recipe et demande que le nombre de r.id_recipe par r.name_recipe soit supérieur à 1. id_recipe n'est-il pas l'identifiant de name_recipe ? Donc unique pour chaque name_recipe ?

J'avais précisié dans ma requête que le nombre figurant dans le HAVING devait être celui du nombre d'éléments de la liste du IN, autrement dit le nombre d'ingrédients cherchés, pas le nombre de recettes !
__________________
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
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 17h09.


 
 
 
 
Partenaires

Hébergement Web