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 :

Case - Respect de 2 conditions


Sujet :

Langage SQL

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 157
    Points : 54
    Points
    54
    Par défaut Case - Respect de 2 conditions
    Bonjour,
    J'aimerais dire en SQL
    Affiche tous les produits dans ma table ProduitFiltre qui ont la valeur 2 quand idFiltre=4 et la valeur 1 quand idFiltre=12, et seulement les produis qui respectent ces 2 conditions.

    J'ai fait ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select codeMachine  
    from ProduitFiltre p 
    where case 
    		when p.idFiltre=4 and p.Valeur=2 then 1 
    		when p.idFiltre=12 and p.Valeur=1 then 1 
    end = 1
    et aussi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    select codeMachine  
    from ProduitFiltre p 
    where case 
    		when p.idFiltre=4 and p.Valeur=2 then 1  
    end = 1
    where case 
    		when p.idFiltre=12 and p.Valeur=1 then 1 
    end = 1

    Mais ni l'un ni l'autre ne fonctionne, soit ça m'affiche pas les bons produits, soit ça ne maffiche rien...
    MErci de votre aide

  2. #2
    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,
    C'est faisable avec un count:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    select codemachine,count(*)
    from Produitfiltre p
    where  (p.idFiltre=4 and p.Valeur=2) or ( p.idFiltre=12 and p.Valeur=1)
    group by codemachine
    having count(*) = 2

    Tatayo.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 157
    Points : 54
    Points
    54
    Par défaut
    Merci...
    le having count(*) = 2
    Le 2 c'est pour le nombre de conditions qu'il doit respecter?
    Merci

  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
    C'est ça. Par contre je suis parti du principe que le triplet CodeMachine/IdFiltre/Valeur est unique.

    Tatayo.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 157
    Points : 54
    Points
    54
    Par défaut
    pfff ça fonctionne pas......

    Le triplet CodeMachine/IdFiltre/Valeur est bien unique.

    Ma requete intégral est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT nomMachine, URLGamme, prixMachine, photoMachine, designationMachine, COUNT( * ) 
    FROM machine m
    JOIN gerer g ON m.codeMachine = g.idproduit
    JOIN ProduitFiltre p ON m.codeMachine = p.codeMachine
    JOIN AssociationGamme a ON m.codeMachine = a.CodeMachine
    JOIN GammeDestructeur gd ON a.idGamme = gd.idGamme
    WHERE g.idFam =8
    AND g.idSousFam =119
    AND m.occassion =0
    AND (p.idFiltre =4 AND p.Valeur =2)
    OR (p.idFiltre =12 AND p.Valeur =1)
    GROUP BY m.codeMachine
    HAVING COUNT( * ) =2
    ORDER BY m.prixMachine
    mais on dirais que ça m'affiche le contraire c'est à dire toutes les machines dont les filtres ne sont pas égal à ces différentes valeurs....
    Merci de votre aide

  6. #6
    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
    Quelque chose me dit que tu utilises MySql... Toutes les colonnes qui ne font pas l'objet d'une fonction d'agrégation doivent être dans le GROUP-BY, ce qui n'est pas du tout le cas ici...
    De plus ici les parenthèses sont mal placés dans le WHERE.

    Je pense que le plus simple ici est de faire 2 jointures entre ProduitFiltre et Machine, pour tester les deux conditions.

    Tatayo.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 157
    Points : 54
    Points
    54
    Par défaut
    ben oui mysql...

    qqch comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT nomMachine, URLGamme, prixMachine, photoMachine, designationMachine
    FROM machine m
    JOIN gerer g ON m.codeMachine = g.idproduit
    JOIN ProduitFiltre p ON m.codeMachine = p.codeMachine
    JOIN AssociationGamme a ON m.codeMachine = a.CodeMachine
    JOIN GammeDestructeur gd ON a.idGamme = gd.idGamme
    JOIN ProduitFiltre p ON (p.idFiltre =4 AND p.Valeur =2)
    JOIN ProduitFiltre p ON (p.idFiltre =12 AND p.Valeur =1)
    WHERE g.idFam =8
    AND g.idSousFam =119
    AND m.occassion =0
    GROUP BY m.codeMachine
    ORDER BY m.prixMachine
    mais ça ne fonctionne pas...
    merci de votre aide

  8. #8
    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
    Là je pense qu'il faut réviser un peu les jointures en SQL... Trois jointures avec le même alias ?

    Tatayo.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 157
    Points : 54
    Points
    54
    Par défaut
    ah ok..... alors j'ai fait ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT nomMachine, URLGamme, prixMachine, photoMachine, designationMachine
    FROM machine m
    JOIN gerer g ON m.codeMachine = g.idproduit
    JOIN ProduitFiltre p ON m.codeMachine = p.codeMachine
    JOIN AssociationGamme a ON m.codeMachine = a.CodeMachine
    JOIN GammeDestructeur gd ON a.idGamme = gd.idGamme
    JOIN ProduitFiltre pj ON (pj.idFiltre =4 AND pj.Valeur =2)
    JOIN ProduitFiltre pk ON (pk.idFiltre =12 AND pk.Valeur =1)
    WHERE g.idFam =8
    AND g.idSousFam =119
    AND m.occassion =0
    GROUP BY m.codeMachine
    ORDER BY m.prixMachine
    mais reponse...#2006 - MySQL server has gone away

    Comment je peut améliorer la chose???

  10. #10
    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
    Qu'est-ce qui fait le lien entre pj, pk et les autres tables de la requête ?
    Qu'est-ce qui filtre les lignes de p, en dehors du lien avec m ?

    Tatayo.

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 157
    Points : 54
    Points
    54
    Par défaut
    ouiiiiiii ça fonctionne

    donc j'ai fait ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT nomMachine, URLGamme, prixMachine, photoMachine, designationMachine
    FROM machine m
    JOIN gerer g ON m.codeMachine = g.idproduit
    JOIN ProduitFiltre p ON m.codeMachine = p.codeMachine
    JOIN AssociationGamme a ON m.codeMachine = a.CodeMachine
    JOIN GammeDestructeur gd ON a.idGamme = gd.idGamme
    JOIN ProduitFiltre pj ON m.codeMachine = pj.codeMachine AND (pj.idFiltre =4 AND pj.Valeur =2)
    JOIN ProduitFiltre pk ON m.codeMachine = pk.codeMachine AND (pk.idFiltre =12 AND pk.Valeur =1)
    WHERE g.idFam =8
    AND g.idSousFam =119
    AND m.occassion =0
    GROUP BY m.codeMachine
    ORDER BY m.prixMachine
    par contre je n'ai pas compris :
    Qu'est-ce qui filtre les lignes de p, en dehors du lien avec m ?
    Merci

  12. #12
    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
    Citation Envoyé par widi70 Voir le message
    par contre je n'ai pas compris :
    Dans ta dernière requête, à quoi sert la jointure suivante:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ...
    JOIN ProduitFiltre p ON m.codeMachine = p.codeMachine
    ..
    Vu que les filtres sont testés avec les jointures sur les alias pj et pk, et que l'alias p n'est utilisé nul part dans la requête ?

    D'ailleurs pour être plus propre les conditions sur idFiltre et Valeur devraient être dans le WHERE, et non dans la jointure.

    Tatayo.

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 157
    Points : 54
    Points
    54
    Par défaut

    Parfait j'ai tout compris.... pas évident tout ça.....
    alors résultat final
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT nomMachine, URLGamme, prixMachine, photoMachine, designationMachine
    FROM machine m
    JOIN gerer g ON m.codeMachine = g.idproduit
    JOIN AssociationGamme a ON m.codeMachine = a.CodeMachine
    JOIN GammeDestructeur gd ON a.idGamme = gd.idGamme
    JOIN ProduitFiltre pj ON m.codeMachine = pj.codeMachine 
    JOIN ProduitFiltre pk ON m.codeMachine = pk.codeMachine 
    WHERE g.idFam =8
    AND g.idSousFam =119
    AND m.occassion =0
    AND (pj.idFiltre =4 AND pj.Valeur =2)
    AND (pk.idFiltre =12 AND pk.Valeur =1)
    GROUP BY m.codeMachine
    ORDER BY m.prixMachine

    Merci

  14. #14
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Pourquoi écrivez-vous du group by à tout va ?
    Si c'est pour faire joli, et bien ça ne l'est pas.

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

Discussions similaires

  1. Case a cocher sous condition
    Par Mairequimby dans le forum VBA Access
    Réponses: 6
    Dernier message: 10/04/2011, 05h18
  2. Case à cocher : poser des conditions
    Par enrico83600 dans le forum Langage
    Réponses: 7
    Dernier message: 31/05/2009, 12h35
  3. Réponses: 1
    Dernier message: 17/07/2007, 15h45
  4. colorer une case qui repond aune condition
    Par D.Mounir dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 30/05/2007, 11h50
  5. [SQL] Ma requête renvoie tous les tuples et ne respecte pas la condition AND
    Par JackBeauregard dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 13/02/2007, 13h33

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