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

Langage SQL Discussion :

Requête WHERE / AND


Sujet :

Langage SQL

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Février 2023
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Cantal (Auvergne)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Février 2023
    Messages : 4
    Points : 1
    Points
    1
    Par défaut Requête WHERE / AND
    Bonjour,

    En loisirs je souhaite créer une base de données qui me permet de trouver des recettes en fonction d'ingrédients disponible. J'imagine que je ne suis pas le premier.
    Pour cela j'utilise Access Microsoft 365.
    J'ai les tables et relations suivantes :

    Nom : Capture.PNG
Affichages : 194
Taille : 13,0 Ko

    J'ai une recette "Test" avec les ingrédients "Tomate" et "Ail".

    Lorsque je fais ma requête avec un seul ingrédient, j'ai bien ma recette "Test" qui est renvoyée. Mais lorsque je souhaite combiner les deux, je n'ai aucun résultats.

    J'ai testé la forme de la requête avec Instant SQL Formater et SQL Format.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT Ingrédient.Ingrédient,
           Recettes.Recette
    FROM Recettes
    INNER JOIN (Ingrédient
                INNER JOIN Ingrédient_recette ON Ingrédient.N° = Ingrédient_recette.Ingrédient) ON Recettes.N° = Ingrédient_recette.Recette
    WHERE (((Ingrédient.Ingrédient)="Tomate"))
      AND (((Ingrédient.Ingrédient)="Ail")) ;
    Pouvez-vous m'aider s'il vous plait ?

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    721
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 721
    Points : 1 876
    Points
    1 876
    Par défaut
    Au lieu d'un AND je pense que vous voulez OR, ou mieux encore une clause IN:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE Ingrédient.Ingrédient IN ("Tomate", "Ail")
    C'est la meilleure manière de combiner plusieurs critères de sélection.
    Quand vous y réfléchissez, chaque ingrédient est unique, donc les deux conditions ne peuvent pas être vraies simultanément et vous devez donc reformuler la requête.

  3. #3
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 909
    Points
    38 909
    Billets dans le blog
    9
    Par défaut
    Bonjour,

    La table "ingredient_recette" est une table associative.
    Ce faisant, elle ne doit pas avoir d'identifiant propre, son identifiant c'est le couple identifiant ingrédient + identifiant recette
    De plus, il est préférable d'éviter les caractères spéciaux (accents, espaces, cédilles...) dans les noms d'objets (noms de tables, de colonnes...).
    Remplacez "N°" par "num", "ingrédient" par "ingredient" etc., ce sera bien plus simple pour les requêtes

    Enfin, la pléthore de parenthèses inutiles nuit à la relecture, supprimez-les !

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Bonjour,
    En fait tout dépend du résultat attendu:
    1. Les recettes qui ont besoin d'au moins l'un des deux ingrédients
    2. Celles qui ont besoin de tous les ingrédients

    Dans le premier cas, la solution de binarygirl fonctionne.
    Mais dans le second il faut une approche différente:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT  Recettes.Recette,count(*)
    FROM Recettes
    INNER JOIN Ingrédient_recette 
    ON Recettes.N° = Ingrédient_recette.Recette
    INNER JOIN Ingrédient 
    ON Ingrédient.N° = Ingrédient_recette.Ingrédient 
    WHERE Ingrédient.Ingrédient IN ("Tomate", "Ail")
    group by Recettes.Recette
    having count(*) = 2

    Tatayo.

  5. #5
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 909
    Points
    38 909
    Billets dans le blog
    9
    Par défaut
    @Tatayo : attention, la double quote sert à délimiter les noms d'objets comportant des caractères spéciaux, les chaînes de caractères doivent être délimitées par de simples quotes : WHERE Ingrédient.Ingrédient IN ('Tomate', 'Ail') et non pas WHERE Ingrédient.Ingrédient IN ("Tomate", "Ail"). Ca changera le résultat s'il existe une colonne portant l'un des noms entre doubles quotes

  6. #6
    Nouveau Candidat au Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Février 2023
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Cantal (Auvergne)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Février 2023
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Bonjour à tous,

    Merci à tous pour vos réponse.

    @tatayo : Le résultat attendu est bien le ou les recettes qui ont besoins de tous les ingrédients.

    @escartefigue : Je ne suis pas bien sûr de comprendre ce qu'est une table associative et son impact. Cela signifie que je ne dois pas avoir de clé "N°" ? Comment faire pour coupler identifiant ingrédient + identifiant recette dans Access?

  7. #7
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 909
    Points
    38 909
    Billets dans le blog
    9
    Par défaut
    Un "table associative" est une table issue d'une association du modèle conceptuel des données.

    Dans votre modèle conceptuel, on a deux objets de gestion, deux acteurs, ce sont les recettes et les ingrédients.
    Ces deux acteurs sont en relation : une recette utilise un à plusieurs ingrédients et un ingrédient est utilisé par une à plusieurs recettes.

    Ce qui se modélise ainsi avec en couleurs, le modèle conceptuel (MCD) et en gris, le modèle tabulaire qui en est issu (MLD) :

    Nom : Sans titre.png
Affichages : 131
Taille : 16,9 Ko

    Au niveau conceptuel, seuls les objets de gestion (les rectangles jaunes) possèdent un identifiant, les associations (ovales bleus) n'en n'ont pas.

    La table que vous avez appelée "ingredient_recette" correspond à la table issue de l'association que j'ai nommée "UT_utiliser".
    Dans cette table, on hérite des identifiants recette et identifiant ingrédient, ce qui permet de faire le lien avec l'un et l'autre.
    L'identifiant supplémentaire que vous avez appelé n° ne sert à rien, il ne permet pas de faire le lien avec la recette ni avec l'ingrédient (on "crame" donc une colonne et un index inutiles) et en plus, il présente le risque, d'avoir pour des valeurs différentes de n°, plusieurs fois le même couple {recette; ingrédient}, donc des redondances.


    Voici ce que ça donne sous Access :

    Nom : Sans titre.png
Affichages : 127
Taille : 12,6 Ko

    Le gros défaut d'Access (défaut qu'il partage avec MySQL workbench), c'est qu'il ne permet pas de créer un modèle conceptuel, il attaque directement avec le modèle tabulaire, c'est la source du genre d'erreurs que vous avez commise.
    Si vous aviez modélisé avec un logiciel de modélisation en commençant par le MCD, vous ne seriez pas tombé dans ce piège .

  8. #8
    Nouveau Candidat au Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Février 2023
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Cantal (Auvergne)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Février 2023
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Merci beaucoup pour les explications

  9. #9
    Nouveau Candidat au Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Février 2023
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Cantal (Auvergne)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Février 2023
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par escartefigue Voir le message
    Bonjour,

    La table "ingredient_recette" est une table associative.
    Ce faisant, elle ne doit pas avoir d'identifiant propre, son identifiant c'est le couple identifiant ingrédient + identifiant recette
    De plus, il est préférable d'éviter les caractères spéciaux (accents, espaces, cédilles...) dans les noms d'objets (noms de tables, de colonnes...).
    Remplacez "N°" par "num", "ingrédient" par "ingredient" etc., ce sera bien plus simple pour les requêtes

    Enfin, la pléthore de parenthèses inutiles nuit à la relecture, supprimez-les !
    J'ai l'impression qu'Access a besoin des parenthèses. Lorsque je tape le code de @tatayo, j'ai un message d'erreur qui s'affiche :
    Nom : Capture.PNG
Affichages : 123
Taille : 7,6 Ko

    J'ai essayé de modifier le code en gardant certaine parenthèse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT Recettes.Recette
    FROM Recettes 
    INNER JOIN (Ingrédient_recette ON Recette.N°=Ingrédient_recette.Recette) INNER JOIN (Ingrédient ON Ingrédient.N° = Ingrédient_recette.Ingrédient) 
    WHERE ((Ingrédient.Ingrédient) IN ("Tomate","Ail"));
    Cette fois le message d'erreur dest "Erreur de syntaxe dans l'opération JOIN".

    Que pouvez-vous me recommander ?

  10. #10
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 909
    Points
    38 909
    Billets dans le blog
    9
    Par défaut
    • première recommandation : comme déjà indiqué plus haut, supprimez les caractères spéciaux de vos noms d'objet, par exemple renommez la colonne "n°" en "num"
    • deuxième recommandation, comme également dit plus haut, les chaînes de caractères doivent être délimitées par des simples quotes et non pas par des guillemets, donc remplacez IN ("Tomate","Ail") par IN ('Tomate','Ail')
    • troisième recommandation, essayez en codant la jointure comme ci-dessous


    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT Recettes.Recette
    FROM Recettes 
    INNER JOIN Ingrédient_recette 
          INNER JOIN Ingrédient 
             ON Ingrédient.Num = Ingrédient_recette.Ingrédient 
       ON Recette.Num=Ingrédient_recette.Recette
    WHERE Ingrédient.Ingrédient IN ('Tomate','Ail')

Discussions similaires

  1. Réponses: 2
    Dernier message: 03/03/2010, 20h49
  2. [MySQL] requête WHERE, OR ?
    Par Angelik dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 11/05/2007, 18h58
  3. Requête avec AND
    Par zeugzeug dans le forum Requêtes
    Réponses: 3
    Dernier message: 12/03/2007, 16h49
  4. Réponses: 6
    Dernier message: 12/09/2006, 08h42
  5. Bonne requête WHERE
    Par Anduriel dans le forum Langage
    Réponses: 2
    Dernier message: 26/06/2006, 17h47

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