Exclusion total d'enregistrements en SQL

Résolu/Fermé
Dacobah Messages postés 260 Date d'inscription samedi 26 novembre 2005 Statut Membre Dernière intervention 28 septembre 2011 - Modifié par Strumpfette le 14/03/2016 à 12:32
Dacobah Messages postés 260 Date d'inscription samedi 26 novembre 2005 Statut Membre Dernière intervention 28 septembre 2011 - 16 mai 2010 à 12:42
Bonjour à tous !

Je travail sur un projet de site de cuisine qui est lié à une base de données. J'ai plusieurs tables qui sont reliées.

Ce que je souhaite à partir de cela, c'est afficher les recettes qui plairont à un utilisateur. C'est-à-dire les recettes qui possèdent des ingrédients que l'utilisateur et qui ne possèdent pas des ingrédients que l'utilisateur n'aime pas.

Par exemple : l'utilisateur A déteste les citrons et les oranges. Par contre il adore les noisettes et les fraises.

La liste des recettes de la base de données est :
- Tarte au citron (contient l'ingrédient citron)
- Tarte à l'orange (contient les ingrédients orange et noisettes)
- Tarte aux fraises (contient les ingrédients fraises et noisettes)

Le système devrait donc n'afficher que la tarte aux fraises car les deux premières contiennent au moins un ingrédient que l'utilisateur n'aime pas.



J'ai donc procéder par étapes et j'arrive à cette requête :

SELECT * FROM recette
INNER JOIN posséder ON posséder.recette_id = recette.recette_id
WHERE ingredient_id NOT IN(
SELECT ingredient_id FROM détester
WHERE utilisateur_id = 'A';


J'obtiens à l'écran (en reprenant mon exemple des tartes ci-dessus):

Tartes au fraises
Tartes aux fraises
Tarte à l'orange


Cette partie de code marche ... à l'exception de "Tarte à l'orange" qui ne devrait pas s'afficher. Je peux toujours faire un GROUP BY pour grouper les "Tartes aux fraises" mais le résultat "Tarte à l'orange" persiste car comme l'ingrédient "Noisettes" ai apprécié par l'utilisateur A ça l'affiche quand même une fois.

Comment faire pour exclure ces résultats de recettes qui contiennent des ingrédients à la fois appréciés et détestés par un utilisateur ?

Je pense que je suis proche de la solution mais je n'arrive pas à trouver ce qui manque.

Merci d'avance à tous.

A voir également:

2 réponses

Salut

décomposons un peu le bidule...

1) les ingrédients appréciés par Fiu :
select ingredient_id from ingredient i, aimer a, utilisateur u
where i.ingredient_id = a.ingredient_id
and a.utilisateur_id = u.utilisateur_id
and u.utilisateur_nom = 'Fiu'

2) les ingrédients détestés par Fiu :
select ingredient_id from ingredient i, detester d, utilisateur u
where i.ingredient_id = d.ingredient_id
and d.utilisateur_id = u.utilisateur_id
and u.utilisateur_nom = 'Fiu'

3) la synthèse brutale serait
select distinct r.recette_nom
from recette r, posseder p, ingredient i
where r.recette_id = p.recette_id
and p.ingredient_id = i.ingredient_id
and i.ingredient_id in (requete appréciés)
and i.ingredient_id not in (requete détestés)

4) pour simplifier, on pourrait intégrer la sous-requête in à la requête principale et garder une sous-requête pour le not in
select distinct r.recette_nom
from recette r, posseder p, ingredient i, aimer a, utilisateur u
where r.recette_id = p.recette_id
and p.ingredient_id = i.ingredient_id
and i.ingredient_id = a.ingredient_id
and a.utilisateur_id = u.utilisateur_id
and u.utilisateur_nom = 'Fiu'
and i.ingredient_id not in (
select ingredient_id from ingredient i, detester d, utilisateur u
where i.ingredient_id = d.ingredient_id
and d.utilisateur_id = u.utilisateur_id
and u.utilisateur_nom = 'Fiu'
)

5) une autre voie serait d'associer les recettes à chacune des requêtes appréciés/détestés et de soustraire les destestés via l'opérateur minus
select distinct r.recette_nom
from recette r, posseder p, ingredient i, aimer a, utilisateur u
where r.recette_id = p.recette_id
and p.ingredient_id = i.ingredient_id
and i.ingredient_id = a.ingredient_id
and a.utilisateur_id = u.utilisateur_id
and u.utilisateur_nom = 'Fiu'
minus
select distinct r.recette_nom
from recette r, posseder p, ingredient i, detester d, utilisateur u
where r.recette_id = p.recette_id
and p.ingredient_id = i.ingredient_id
and i.ingredient_id = d.ingredient_id
and d.utilisateur_id = u.utilisateur_id
and u.utilisateur_nom = 'Fiu'

6) à toi de jouer !
1
Dacobah Messages postés 260 Date d'inscription samedi 26 novembre 2005 Statut Membre Dernière intervention 28 septembre 2011 74
16 mai 2010 à 12:42
Mea Culpa ! J'avais oublié de précisé que mon problème avait résolu grâce à la cinquième solution proposée par Fiu. Merci encore !
0