Faire une liste des valeurs communes entre 2 attributs

Résolu/Fermé
waren56 - Modifié le 19 déc. 2017 à 22:35
 waren56 - 20 déc. 2017 à 16:56
Bonjour, je suis débutant en SQL et j'étais en train de travailler sur une base de données concernant des recettes et je cherchais comment simplement arriver à ce résultat :

https://imgur.com/a/795QT

Pour l'instant je suis un peut perdu sur la condition que le WHERE doit porter (IN, GROUP BY EXISTS,...?)

SELECT i.NomIngredient AS 'Ingredients communs'
FROM PI101_INGREDIENTS i
JOIN PI101_COMPOSITIONS c USING (IdIngredient)
JOIN PI101_RECETTES r (IdRecette)
WHERE r.NomIngredients IN ( 'Cake à la tomate' = 'Cake aux noix et au roquefort');

Merci d'avance pour votre aide.
A voir également:

1 réponse

jordane45 Messages postés 38139 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 20 avril 2024 4 649
Modifié le 20 déc. 2017 à 01:26
Bonjour,

Déjà... tu pourrais poster l'image DIRECTEMENT sur le forum au lieu d'en mettre un lieu qui pourrait être supprimé...

Donc voici l'image en question :


Puis, pour poster du code sur le forum... il faut utiliser LES BALISES DE CODE
Explications ici : https://codes-sources.commentcamarche.net/faq/10686-le-nouveau-codes-sources-comment-ca-marche#balises-code

Ensuite... la structure de tes tables voir même un DUMP avec quelques données seraient les bienvenus.....

Et enfin
dans un IN tu mets DES éléments séparés par des virgules ... tu n'y mets pas de condition... que vient faire le "=" ici ???
A la limite, ce que tu cherches c'est
WHERE r.NomIngredients IN ( 'Cake à la tomate' , 'Cake aux noix et au roquefort'); 



Mais si ce sont les ingrédients communs que tu cherches... la "bonne" requête serait plutôt du genre
SELECT i.NomIngredient AS 'Ingredients communs'
FROM PI101_COMPOSITIONS c
LEFT JOIN PI101_INGREDIENTS i ON i.IdIngredient = c.IdIngredient
LEFT JOIN PI101_RECETTES r ON r.IdRecette = c.IdRecette
WHERE c.NomRecette = 'Cake à la tomate'
 AND i.IdIngredient IN (
  SELECT i2.NomIngredient
  FROM PI101_COMPOSITIONS c2
  LEFT JOIN PI101_INGREDIENTS i2 ON i2.IdIngredient = c2.IdIngredient
  LEFT JOIN PI101_RECETTES r2 ON r2.IdRecette = c2.IdRecette
  WHERE c2.NomRecette = 'Cake aux noix et au roquefort'
 )
 


Ou sinon, en utilisant du GROUP BY et un HAVING COUNT >1
Un truc du genre
SELECT i.NomIngredient AS 'Ingredients communs'
FROM PI101_INGREDIENTS i
JOIN PI101_COMPOSITIONS c USING (IdIngredient)
JOIN PI101_RECETTES r (IdRecette)
WHERE r.NomRecette IN ( 'Cake à la tomate' , 'Cake aux noix et au roquefort')
GROUP BY i.NomIngredient
HAVING COUNT(i.NomIngredient) >1


NB: J'ai écrit les requêtes de têtes sans tester... si elles ne marchent pas.. il faudra les adapter...
Mais bon.. sans avoir ta structure ni de dump... difficile de t'en dire plus


Cordialement, 
Jordane                                                                 
1
Bonjour, désolé de ne pas avoir pensé à mettre les structures, je me suis dit que c'était une opérations simple que d'identifié des valeurs communes entre deux liste donc bon... J'y penserai la prochaine fois.

Sinon ta deuxième requête a marché après quelques modif donc je te remercie.
0