Problème requête SQL
silitix
Messages postés
2
Date d'inscription
Statut
Membre
Dernière intervention
-
NDOUKI Messages postés 110 Date d'inscription Statut Membre Dernière intervention -
NDOUKI Messages postés 110 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
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é.
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.
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é.
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.
A voir également:
- Problème requête SQL
- Logiciel sql - Télécharger - Bases de données
- Sql lister les tables ✓ - Forum Programmation
- Requête bloquée par le pare-feu applicatif claranet webfence ✓ - Forum Réseaux sociaux
- Jointure sql ✓ - Forum MySQL
- Erreur lors de l'envoi de la requête facebook - Forum Facebook
4 réponses
Bonjour,
En fait tu as fait le plus dur, cad définir les critères de jonction entre les tables.
Mais...n'oublie pas que tous tes critères sont appliqués pour te renvoyer chaque enregistrement.
Or, un champ (nom_ingrédient) ne peut à la fois être égal à une valeur et à une autre !!!
C'est soit du lait...soit du beurre !!! Faut choisir !
Tu voulais en fait l'un ou l'autre. Dans ce cas là, faire :
...and nom_ingredient in ('lait','beurre')
ou une autre syntaxe plus large qui va renvoyer tous les noms commencant par la lettre b :
...and nom_ingredient like 'b%'
En espérant t'avoir aidé...A+
En fait tu as fait le plus dur, cad définir les critères de jonction entre les tables.
Mais...n'oublie pas que tous tes critères sont appliqués pour te renvoyer chaque enregistrement.
Or, un champ (nom_ingrédient) ne peut à la fois être égal à une valeur et à une autre !!!
C'est soit du lait...soit du beurre !!! Faut choisir !
Tu voulais en fait l'un ou l'autre. Dans ce cas là, faire :
...and nom_ingredient in ('lait','beurre')
ou une autre syntaxe plus large qui va renvoyer tous les noms commencant par la lettre b :
...and nom_ingredient like 'b%'
En espérant t'avoir aidé...A+
Bonjour Sylvlau et merci d'avoir répondu aussi vite,
en réalité il me faut l'un et l'autre, CAD il me faut les recettes qui comportent l'ingredient lait et l'ingredient beurre. C'est là que je coince. Donc je ne sais pas si je dois créer une table ingrédient 1 et ingrédient 2. Ces deux tables ayant les mêmes données et libellés.
Merci
en réalité il me faut l'un et l'autre, CAD il me faut les recettes qui comportent l'ingredient lait et l'ingredient beurre. C'est là que je coince. Donc je ne sais pas si je dois créer une table ingrédient 1 et ingrédient 2. Ces deux tables ayant les mêmes données et libellés.
Merci
D'acccoooooooooooooorrrrrrrrrrrrrrrrrdddddddddddd !!!!
Donc tu veux les recettes contenant à la fois le lait et le beurre ?
Alors essaie d'abord simplement :
select c.id_recette from contenir c, ingredient i
where i.id_ingredient = c.id_ingredient
and i.nom_ingredient = 'lait'
Ceci va te donner les id_recette qui contiennent du lait !!
Puis, tu fais la même pour le beurre :
select c.id_recette from contenir c, ingredient i
where i.id_ingredient = c.id_ingredient
and i.nom_ingredient = 'beurre'
Et maintenant on regroupe tout ça :
SELECT distinct req1.id_recette
from (select c.id_recette from contenir c, ingredient i
where i.id_ingredient = c.id_ingredient
and i.nom_ingredient = 'lait') req1,
(select c.id_recette from contenir c, ingredient i
where i.id_ingredient = c.id_ingredient
and i.nom_ingredient = 'beurre') req2
where req1=id_recette = req2.id_recette
L'idée est donc de faire 2 requetes select (req1 et req2) qui ramènent chacune des id_recette, puis de les réunir en donnant une condition d'égalité (sur l'id_recette).
Bien sur, il y a plus performant, plus élégant, mais sauf erreur de ma part...ça marche. Si besoin tu peux en faire 3 ou 4...sur le même principe.
Eventuellement, en fonction du sgbdr tu peux etre obligé de renommer la table contenir en c1 dans req1 et c2 dans req2.
A+
Donc tu veux les recettes contenant à la fois le lait et le beurre ?
Alors essaie d'abord simplement :
select c.id_recette from contenir c, ingredient i
where i.id_ingredient = c.id_ingredient
and i.nom_ingredient = 'lait'
Ceci va te donner les id_recette qui contiennent du lait !!
Puis, tu fais la même pour le beurre :
select c.id_recette from contenir c, ingredient i
where i.id_ingredient = c.id_ingredient
and i.nom_ingredient = 'beurre'
Et maintenant on regroupe tout ça :
SELECT distinct req1.id_recette
from (select c.id_recette from contenir c, ingredient i
where i.id_ingredient = c.id_ingredient
and i.nom_ingredient = 'lait') req1,
(select c.id_recette from contenir c, ingredient i
where i.id_ingredient = c.id_ingredient
and i.nom_ingredient = 'beurre') req2
where req1=id_recette = req2.id_recette
L'idée est donc de faire 2 requetes select (req1 et req2) qui ramènent chacune des id_recette, puis de les réunir en donnant une condition d'égalité (sur l'id_recette).
Bien sur, il y a plus performant, plus élégant, mais sauf erreur de ma part...ça marche. Si besoin tu peux en faire 3 ou 4...sur le même principe.
Eventuellement, en fonction du sgbdr tu peux etre obligé de renommer la table contenir en c1 dans req1 et c2 dans req2.
A+
slt,
essaye avec ceci, je l'ai pas testé
SELECT nom_recette
FROM ingredients as i, contenir as c, recettes as r
WHERE i.id_ingredient = c.id_ingredient
AND r.id_recette = c.id_recette
AND nom_ingredient = 'lait'
AND nom_ingredient = 'beurre'
remarque que j'ai ajouté le "as" apres chaque table de la clause "FROM"
essaye avec ceci, je l'ai pas testé
SELECT nom_recette
FROM ingredients as i, contenir as c, recettes as r
WHERE i.id_ingredient = c.id_ingredient
AND r.id_recette = c.id_recette
AND nom_ingredient = 'lait'
AND nom_ingredient = 'beurre'
remarque que j'ai ajouté le "as" apres chaque table de la clause "FROM"