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 :

Requete sur tri multiple


Sujet :

Langage SQL

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 11
    Points : 9
    Points
    9
    Par défaut Requete sur tri multiple
    Bonjour,
    je developpe une application avec connexion a une base de donnée dont voici la structure :
    Table 1
    -ID_T1
    -NomCocktail
    .
    .
    .
    Table2
    -ID_T2
    -NomIngredient
    .
    .
    .
    Table3
    -ID_T3
    -NomChamp1T3 : Correspond a ID_T1
    -NomChamp2T3: Correspond a ID_T2
    La table T3 sert de liens entre les cocktails et les ingrédients.
    Jusque la tout ce passe bien, mais si je veux faire une selection de cocktail comportant 2 ou trois ingrédients (typiquement, j'ai rhum, orange et ananas et je cherche les cocktails possedant ces trois ingrédients au moins) je n'arrive a rien.
    Voici ma requete, qui ne retourne rien.
    SELECT NomChamp1T3 FROM table3 WHERE ((NomChamp2T3=1)AND(NomChamp2T3=3))
    J'ai essayer IN mais cela me retourne tous les cocktails contenant au moins 1 ingrédient (ce que je ne désire pas).
    Quelqu'un a-t-il une solution ?
    Merci par avance.
    Cordialement,
    Guillaume C.

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    490
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 490
    Points : 201
    Points
    201
    Par défaut
    Table 1
    -ID_T1
    -NomCocktail
    .
    .
    .
    Table2
    -ID_T2
    -NomIngredient
    .
    .
    .
    Table3
    -ID_T3
    -NomChamp1T3 : Correspond a ID_T1
    -NomChamp2T3: Correspond a ID_T2
    La table T3 sert de liens entre les cocktails et les ingrédients.
    En faisant ça qu'est ce que ça donne ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SELECT NomCocktail, nomIngredient FROM T1 INNER JOIN T3 ON (T3.nomChamp2T3 = T2.ID_T2)
    WHERE NomIngredient = orange AND NomIgredient = rhum

  3. #3
    Membre expérimenté Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Points : 1 738
    Points
    1 738
    Par défaut
    Il est tout a fait normale que la requete dont la clause est

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    WHERE ((NomChamp2T3=1)AND(NomChamp2T3=3))
    ne ramene rien, car NomChamp2T3 ne peut pas etre a la fois egale a 1 et a 3 !!!

    Voici le type de requete qui peut vous aider a obtenir ce que vous voulez
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT NomChamp1T3  
    FROM
       Table3 
    WHERE 
       NomChamp2T3 IN (1,3)   /* mettez ici les elements a inclure */
    GROUP BY NomChamp1T3   
    HAVING COUNT(1)>=2       /* mettez ici le nombre d'occurences mini */
    La methode avec un jointure n'est pas viable car tres peu evolutive.

    Bon courage

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 11
    Points : 9
    Points
    9
    Par défaut
    Bonjour,

    Citation Envoyé par Yanika_bzh Voir le message
    Il est tout a fait normale que la requete dont la clause est

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    WHERE ((NomChamp2T3=1)AND(NomChamp2T3=3))
    ne ramene rien, car NomChamp2T3 ne peut pas etre a la fois egale a 1 et a 3 !!!
    ->C'est ce que j'avais fini par comprendre.

    Voici le type de requete qui peut vous aider a obtenir ce que vous voulez
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT NomChamp1T3  
    FROM
       Table3 
    WHERE 
       NomChamp2T3 IN (1,3)   /* mettez ici les elements a inclure */
    GROUP BY NomChamp1T3   
    HAVING COUNT(1)>=2       /* mettez ici le nombre d'occurences mini */
    La methode avec un jointure n'est pas viable car tres peu evolutive.

    Bon courage
    Génial, cela fonctionne.
    Ca dépasse un peu mes compétences en SQL, mais je vais me renseigner sur le pourquoi du comment, afin de ne plus poser de question élémentaire.
    Meci beaucoup.
    Cordialement,
    Guillaume C

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

Discussions similaires

  1. [Oracle] Problème requete sur tri.
    Par Tonii dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 10/12/2010, 10h49
  2. Requete sur database multiple
    Par JustMe dans le forum SQL
    Réponses: 6
    Dernier message: 04/03/2009, 15h35
  3. Requetes sur tables multiples ! Pour les 'gurus'
    Par bandicoq dans le forum Langage SQL
    Réponses: 5
    Dernier message: 07/08/2008, 11h39
  4. [Access] Requête sur une table et tri sur une autre
    Par VooDooS dans le forum Langage SQL
    Réponses: 2
    Dernier message: 30/08/2006, 15h07
  5. requete avec tri sur date erronée
    Par olivll dans le forum Access
    Réponses: 11
    Dernier message: 20/10/2005, 15h45

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