IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes MySQL Discussion :

Problème requêtes SQL


Sujet :

Requêtes MySQL

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Student
    Inscrit en
    Janvier 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

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

    Informations forums :
    Inscription : Janvier 2012
    Messages : 3
    Points : 1
    Points
    1
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  2. #2
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2011
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2011
    Messages : 55
    Points : 95
    Points
    95
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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)

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Student
    Inscrit en
    Janvier 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

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

    Informations forums :
    Inscription : Janvier 2012
    Messages : 3
    Points : 1
    Points
    1
    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.

  4. #4
    Membre confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 247
    Points : 473
    Points
    473
    Billets dans le blog
    1
    Par défaut EXISTS
    Bonjour,

    Tu peux chercher l'existence d'un ingredient dans une recette ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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(...) ...

  5. #5
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « 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 la suite Linux Mageïa !

  6. #6
    Nouveau Candidat au Club
    Homme Profil pro
    Student
    Inscrit en
    Janvier 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

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

    Informations forums :
    Inscription : Janvier 2012
    Messages : 3
    Points : 1
    Points
    1
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  7. #7
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    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.

    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 Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « 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 la suite Linux Mageïa !

Discussions similaires

  1. Problème requête SQL
    Par mandaillou dans le forum Langage SQL
    Réponses: 15
    Dernier message: 03/10/2005, 11h37
  2. Problème requête SQL dans page ASP
    Par rocs dans le forum ASP
    Réponses: 14
    Dernier message: 26/07/2005, 15h38
  3. problème requête sql
    Par psychoBob dans le forum Langage SQL
    Réponses: 1
    Dernier message: 10/07/2005, 17h50
  4. problème requête sql
    Par perfectdams dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 21/06/2005, 18h09
  5. Réponses: 8
    Dernier message: 23/10/2003, 16h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo