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 :

Jointure et sélection par count


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé Avatar de Cyberbob002
    Inscrit en
    Mai 2003
    Messages
    140
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 140
    Par défaut Jointure et sélection par count
    Bonjour,

    Je suis confronté à un petit problème qui m'empêche d'avancer donc je fais appel à vous

    J'ai 2 tables, recettes et ingredients. La table ingrédient contient l'ID de la recette. Elle est composée de plusieurs lignes représentant les ingrédients. Seulement un ingrédient peu apparaitre plusieurs fois dans la recette.

    Je souhaite, dans le cadre d'un moteur de recherche, trouver toutes les recettes contenant de 1 à N ingrédients.

    Ma requete, qui ne fonctionne pas est la suivante :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT DISTINCT rct_id
    FROM recettes
    JOIN ingredients ON (rct_id = ing_fk_rct_id)
    WHERE ing_id IN (761, 765) -- Identifiant des ingrédients à trouver
    GROUP BY rct_id
    HAVING COUNT(*) = 2
    ORDER BY rct_nom;

    Je dois évidemment trouver les recettes contenant TOUS les ingrédients choisis. C'est pour cela que ma requete ne convient pas. Car dans ce cas, elle peut me retourner les recettes contenant les 2 ingrédients mais aussi celles qui contiennent 2 fois le même ! C'est ce dernier point que je dois enlever.

    J'ai donc fais une autre requête qui je pense est beaucoup moins optimisée mais qui fonctionne
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    SELECT  rct_id, rct_titre
    FROM recettes
    WHERE rct_id IN (
     
    	SELECT ing_fk_rct_id
    	FROM ingredients
    	WHERE ing_id = 761
     
    	INTERSECT 
     
    	SELECT ing_fk_rct_id
    	FROM ingredients
    	WHERE ing_id = 765
    )
     
    ORDER BY rct_id
    ;

    Est-ce que la deuxième est quand même correcte ?
    Ne va-t-elle pas devenir trop gourmande si le nombre d'ingrédients à rechercher augmente ?

  2. #2
    Membre chevronné
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Mars 2006
    Messages
    400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Mars 2006
    Messages : 400
    Par défaut
    Au lieu d'utiliser COUNT(*), essaye d'utiliser COUNT(DISTINCT ing_id).
    En effet, il ne faut compter qu'une seule fois chaque ingrédient.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT DISTINCT rct_id
    FROM recettes
    JOIN ingredients ON (rct_id = ing_fk_rct_id)
    WHERE ing_id IN (761, 765) -- Identifiant des ingrédients à trouver
    GROUP BY rct_id
    HAVING COUNT(DISTINCT ing_id) = 2
    ORDER BY rct_nom

  3. #3
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 136
    Par défaut
    Et comme ça ? :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT DISTINCT rct_id
    FROM recettes
    JOIN ingredients ON (rct_id = ing_fk_rct_id)
    WHERE ing_id = ALL (761, 765) -- Identifiant des ingrédients à trouver
    GROUP BY rct_id
    ORDER BY rct_nom
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  4. #4
    Membre éprouvé Avatar de Cyberbob002
    Inscrit en
    Mai 2003
    Messages
    140
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 140
    Par défaut
    Citation Envoyé par jeremya
    Au lieu d'utiliser COUNT(*), essaye d'utiliser COUNT(DISTINCT ing_id).
    Ca a l'air nikel !
    Je continu mes test avant de mettre un petit "résolu"

    Le ALL par contre ne fonctionne pas (syntaxe SQL)


    Une petite question dans la foulée : je suis sur PostGreSQL et j'utilise pgAdmin3. Lors de mon premier test la requête a mis 5ms (super !) mais plus je l'exécute, plus le temps d'exécution devient long (je suis à 60ms). Savez-vous pourquoi ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Editeur de texte qui fait la sélection par colonne
    Par wodel dans le forum Windows XP
    Réponses: 5
    Dernier message: 10/11/2010, 13h45
  2. Sélection par programme d'un item d'un TDbLookupListBox
    Par defluc dans le forum Bases de données
    Réponses: 14
    Dernier message: 09/03/2007, 19h51
  3. Requête récalcitrante avec un tri par COUNT sans GROUP BY
    Par Ancalagon77 dans le forum Requêtes
    Réponses: 1
    Dernier message: 05/10/2006, 14h27
  4. Réponses: 3
    Dernier message: 31/08/2006, 00h38
  5. Couleur de sélection par défaut
    Par sicard_51 dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 20/04/2003, 23h35

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