Faire une liste des valeurs communes entre 2 attributs

Résolu
waren56 -  
 waren56 -
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.

1 réponse

  1. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 833
     
    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
    1. waren56
       
      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