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 :

efficacité et jointure sqlite


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 2
    Par défaut efficacité et jointure sqlite
    bonjour, j'ai 2 tables
    composition

    idcomposition idrecette idingredient
    1 1 4
    2 1 12
    3 1 45
    4 1 33
    5 2 12
    6 2 26
    7 3 4

    ingredients
    idIngredient quantite
    ...
    4 0
    ...
    12 12
    ...
    26 6
    ...
    33 0
    ...
    45 0

    Concrétement, je cherche une requette qui ne me fasse ressortir que les recettes pour lesquelles tous les ingrédients sont disponibles. Ici ce serait la recette 2
    J'ai bien:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     select count(composition.id) as sum1, 
             composition.idRecette as idc 
    from  composition, 
             ingredient 
    where
             composition.idIngredient = ingredient.id 
             and ingredient.quantite>0 group by idc 
    having sum1 = 
             (select count(composition.id) as sum1 
                        from composition, 
                                ingredient 
                         where
                         composition.idIngredient = ingredient.id and         
                         composition.idRecette=idc group by composition.idRecette
              )
    mais c'est très inefficace

    par jointure classique, type:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select distinct composition.idrecette 
    from composition, ingredient 
    where ingredient.id = composition.idIngredient
     and ingredient.quantite > 0
    Me donne toutes les recettes pour lesquelles j'ai un des ingredient disponibles, ici les recettes 1 et 2.

    or je travaille sur sqlite et FULL JOIN n'est pas disponible

    Quelqu'un a-t-il un suggestion ?

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 143
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    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 143
    Par défaut
    Prends la requête dans l'autre sens : une recette qui a tous les ingrédients est une recette dont aucun ingrédient ne manque.

    Les recettes où il manque un ingrédient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT  cmp.idrecette
    FROM    composition AS cmp
        INNER JOIN
            ingredient  AS ing
            ON  ing.id = comp.idIngredient
    WHERE   ing.quantite = 0
    Je suppose que tu as une table recette(#id, ...)

    Les recettes auxquelles ne manque aucun ingrédient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT  rct.*
    FROM    recette AS rct
    WHERE   rct.id  NOT IN
            (   SELECT  cmp.idrecette
                FROM    composition AS cmp
                    INNER JOIN
                        ingredient  AS ing
                        ON  ing.id = comp.idIngredient
                WHERE   ing.quantite = 0
            )
    Ou encore plus efficace :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT  rct.*
    FROM    recette AS rct
    WHERE   NOT EXISTS
            (   SELECT  1
                FROM    composition AS cmp
                    INNER JOIN
                        ingredient  AS ing
                        ON  ing.id = comp.idIngredient
                WHERE   ing.quantite = 0
                    AND rct.id = cmp.idrecette
            )
    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.

  3. #3
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    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 818
    Billets dans le blog
    14
    Par défaut
    Tu stokes les quantités dans la table des ingrédients plutôt que dans la table des compositions ?

    Ingrédient = beurre

    Pour un plat cuisiné, la quantité sera de quelques grammes et pour un gâteau peut-être de plusieurs centaines de grammes. Tu fais comment ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    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 !

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 2
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    Tu stokes les quantités dans la table des ingrédients plutôt que dans la table des compositions ?

    Ingrédient = beurre

    Pour un plat cuisiné, la quantité sera de quelques grammes et pour un gâteau peut-être de plusieurs centaines de grammes. Tu fais comment ?
    Les quantités dans la table ingrédeints sont les quantités disponibles chez le cuisinier

  5. #5
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 143
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    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 143
    Par défaut
    Et où sont les quantités nécessaires pour la recette ?
    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.

Discussions similaires

  1. Réponses: 0
    Dernier message: 19/03/2012, 15h37
  2. sqlite c# jointure
    Par yuriyan dans le forum SQLite
    Réponses: 2
    Dernier message: 26/07/2010, 10h42
  3. SubSonic et Sqlite - Jointures difficiles
    Par Mjm dans le forum Accès aux données
    Réponses: 4
    Dernier message: 28/05/2009, 22h55
  4. SQLite et jointures
    Par poncet2 dans le forum SQLite
    Réponses: 1
    Dernier message: 31/07/2007, 06h57
  5. Jointures SQLite ? Help
    Par InDaWinD dans le forum SQLite
    Réponses: 2
    Dernier message: 02/05/2006, 09h22

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