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 :

SELECT des lignes qui ont exactement 4 valeurs sur la colonne ?


Sujet :

Langage SQL

  1. #1
    Membre habitué Avatar de mamiberkof
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    290
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Maroc

    Informations forums :
    Inscription : Avril 2005
    Messages : 290
    Points : 155
    Points
    155
    Par défaut SELECT des lignes qui ont exactement 4 valeurs sur la colonne ?
    Bonjour,

    J'ai une table de jointure (provienne d'une relation 1.n - 1.n) ''valeur_filtre_module" avec 3 colonnes : module_ident, item_ident et filtre_projet_valeur_ident et en entré j'ai un tableau (en PHP) qui contient les valeurs du champ filtre_projet_valeur_ident ; $tab : {61,67,86,100}; ma requete me doit retourner exactement les lignes de ma table qui contiennent exactement ces 4 valeurs ,
    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Table:valeur_filtre_module
    module_ident | item_ident  | filtre_projet_valeur_ident
    7----------------5160-------------61
    7----------------5160-------------67
    7----------------5160-------------100
    7----------------5160-------------86
    7----------------5440-------------61
    7----------------5440-------------67
    7----------------5440-------------100
    je dois avoir seulement les 4 premieres lignes , puisque les autres lignes ne remplie pas la condition d'avoir exectement les 4 valeurs (86 n'est pas inclus)

    J'ai essayé la requete : (y a d'autre condition dans ma requete, c pas intressant vous n'en fete pas)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT  DISTINCT vfm. * 
    FROM revue_planifiee rev, module_lotification module, valeur_filtre_module vfm, valeurs_filtre_projet vfp, valeur_filtre_module vfm1
    LEFT  JOIN valeur_filtre_module vfm2 ON ( vfm1.module_ident = vfm2.module_ident AND vfm1.item_ident = vfm2.item_ident ) 
    LEFT  JOIN valeur_filtre_module vfm3 ON (vfm1.module_ident = vfm3.module_ident AND vfm1.item_ident=vfm3.item_ident)
    LEFT  JOIN valeur_filtre_module vfm4 ON ( vfm1.module_ident = vfm4.module_ident AND vfm1.item_ident = vfm4.item_ident)
    WHERE rev.prj_code =  'LYB068' AND rev.sec_id =  'RSK' AND rev.typ_rev_code =  'RSK' AND rev.eta_rev_code =  'VAL' AND vfm.module_ident = module.module_ident AND module.module_libelle =  'RISQUE' AND vfm.filtre_projet_valeur_ident = vfp.filtre_projet_valeur_ident AND vfm1.filtre_projet_valeur_ident = 61 AND vfm2.filtre_projet_valeur_ident = 100 AND vfm3.filtre_projet_valeur_ident = 67 AND vfm4.filtre_projet_valeur_ident = 86
    Merci de me répondre, je suis bloqué...

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 920
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 920
    Points : 51 712
    Points
    51 712
    Billets dans le blog
    6
    Par défaut
    Votre requête est très incohérente : elle mélange des jointures de produits cartésienhs dansla cause WHERE et des jointures externe avec des joins. C'est absurde. Faite toutes vos jointures dans la clause FROM avec des JOIN / ON !

    Pour génériciser votre recherche de n paramètres de la même table en nombre exacte faite un IN assorti d'un HAVING COUNT(*) = n

    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
    16
    17
    18
    SELECT vfm.* 
    FROM   revue_planifiee rev, 
           INNER JOIN module_lotification module
                 ON ?
           INNER JOIN valeur_filtre_module vfm, 
                 ON vfm.module_ident = module.module_ident 
           INNER JOIN valeurs_filtre_projet vfp
                 ON vfm.filtre_projet_valeur_ident = vfp.filtre_projet_valeur_ident
           INNER JOIN valeur_filtre_module vfm
                 ON ?
    WHERE rev.prj_code =  'LYB068' 
      AND rev.sec_id =  'RSK' 
      AND rev.typ_rev_code =  'RSK' 
      AND rev.eta_rev_code =  'VAL' 
      AND module.module_libelle =  'RISQUE' 
      AND vfm.filtre_projet_valeur_ident IN (61, 100, 67, 86)
    GROUP BY ??? --> ici toutes les colonnes de vfm.* 
    HAVING COUNT(*) = 4
    A +

  3. #3
    Membre habitué Avatar de mamiberkof
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    290
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Maroc

    Informations forums :
    Inscription : Avril 2005
    Messages : 290
    Points : 155
    Points
    155
    Par défaut
    D'abord merci pour ton aide et tes conseils, J'ai executer la requete :
    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 vfm. *
    FROM revue_planifiee rev, module_lotification module
      INNER JOIN valeur_filtre_module vfm ON vfm.module_ident = module.module_ident
      INNER JOIN valeurs_filtre_projet vfp ON vfm.filtre_projet_valeur_ident = vfp.filtre_projet_valeur_ident
    WHERE rev.prj_code = 'LYB068' 
      AND rev.sec_id = 'RSK' 
      AND rev.typ_rev_code = 'RSK' 
      AND rev.eta_rev_code = 'VAL'
      AND module.module_libelle = 'RISQUE' 
      AND vfm.filtre_projet_valeur_ident
            IN ( 61, 100, 67, 86 )
    GROUP BY vfm.module_ident, vfm.item_ident, vfm.filtre_projet_valeur_ident
    HAVING count(*)=4
    mais me retourne rien , par contre qaund j'ai enlevé le HAVING, elle me retourne presqque ce que je cherche mais c pas bon , voila ce qu'elle m'a donné sans le HAVING (PJ)
    Images attachées Images attachées  

  4. #4
    Membre habitué Avatar de mamiberkof
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    290
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Maroc

    Informations forums :
    Inscription : Avril 2005
    Messages : 290
    Points : 155
    Points
    155
    Par défaut
    normalement je dois pas avoir les deux derniere lignes (item_ident=5171)

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 920
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 920
    Points : 51 712
    Points
    51 712
    Billets dans le blog
    6
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT vfm.module_ident, vfm.item_ident
    FROM revue_planifiee rev, module_lotification module
      INNER JOIN valeur_filtre_module vfm ON vfm.module_ident = module.module_ident
      INNER JOIN valeurs_filtre_projet vfp ON vfm.filtre_projet_valeur_ident = vfp.filtre_projet_valeur_ident
    WHERE rev.prj_code = 'LYB068' 
      AND rev.sec_id = 'RSK' 
      AND rev.typ_rev_code = 'RSK' 
      AND rev.eta_rev_code = 'VAL'
      AND module.module_libelle = 'RISQUE' 
      AND vfm.filtre_projet_valeur_ident
            IN ( 61, 100, 67, 86 )
    GROUP BY vfm.module_ident, vfm.item_ident
    HAVING count(*)=4
    A +

  6. #6
    Membre habitué Avatar de mamiberkof
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    290
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Maroc

    Informations forums :
    Inscription : Avril 2005
    Messages : 290
    Points : 155
    Points
    155
    Par défaut
    J'ai toujours pas de résultat si je fais HAVING.

    Si je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT *
    FROM `valeur_filtre_module`
    WHERE `item_ident`
    LIKE '5171'
    affiche PJ.1

    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT *
    FROM `valeur_filtre_module`
    WHERE `item_ident`
    LIKE '5170'
    affiche

    cela confimre que la 5171 ne satisfait pas ma condition d'egalité des 4 valeurs ..
    Images attachées Images attachées   

  7. #7
    Expert éminent
    Homme Profil pro
    Big Data / Freelance EURL
    Inscrit en
    Mars 2003
    Messages
    2 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Big Data / Freelance EURL

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 124
    Points : 7 291
    Points
    7 291
    Par défaut
    Le souci c'est qu'on ne sait pas si le résultat de ta requête donne bien 4 lignes ou plus. Comme le souligne SQLPro il doit rester des produits cartésiens. La preuve il y a 4 tables mais seulement deux jointures. Ton DISTINCT regroupe les lignes mais il masque les erreurs (idem GROUP BY). Il faut d'abord que tu lances ta première requête sans GROUP BY ni DISTINCT, que tu vérifies qu'il y a bien 4 lignes, et ensuite seulement tu continues à écrire ta requête comme l'a proposé SQLPro, c'est-à-dire avec le IN (,,,) et le GROUP BY, et le HAVING COUNT.


    La solution suivante a de grande chance de fonctionner mais ce n'est pas propre du tout, c'est seulement pour te montrer qu'il y a un souci dans tes jointures et que la proposition du HAVING est la bonne:

    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 module_ident,item_ident
    FROM(
    SELECT DISTINCT vfm.module_ident, vfm.item_ident,filtre_projet_valeur_ident
    FROM revue_planifiee rev, module_lotification module
      INNER JOIN valeur_filtre_module vfm ON vfm.module_ident = module.module_ident
      INNER JOIN valeurs_filtre_projet vfp ON vfm.filtre_projet_valeur_ident = vfp.filtre_projet_valeur_ident
    WHERE rev.prj_code = 'LYB068' 
      AND rev.sec_id = 'RSK' 
      AND rev.typ_rev_code = 'RSK' 
      AND rev.eta_rev_code = 'VAL'
      AND module.module_libelle = 'RISQUE' ) Ta_sous_requete
    WHERE filtre_projet_valeur_ident
            IN ( 61, 100, 67, 86 ) 
    GROUP BY module_ident, item_ident
    HAVING COUNT(*)=4

  8. #8
    Membre habitué Avatar de mamiberkof
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    290
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Maroc

    Informations forums :
    Inscription : Avril 2005
    Messages : 290
    Points : 155
    Points
    155
    Par défaut
    Bonjour,

    ça marche bien la requete imbriqué

    Je vous remercie tous d'avoir m'aider , merci

  9. #9
    Expert éminent
    Homme Profil pro
    Big Data / Freelance EURL
    Inscrit en
    Mars 2003
    Messages
    2 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Big Data / Freelance EURL

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 124
    Points : 7 291
    Points
    7 291
    Par défaut
    Certes mais tu n'as pas résolu ton problème dans l'absolu. Tu ne devrais pas utiliser mon exemple, en tout cas pas avant d'avoir résolu d'abord ton problème de jointures qui manquent.

    ça fonctionne et ça réponds aux fonctionnalités que tu veux, mais ce n'est pas propre et la personne qui va maintenir derrière toi ne va rien comprendre.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 13/06/2011, 18h41
  2. [AC-2007] Identifier des lignes qui ont une donnée commune
    Par manfre dans le forum Requêtes et SQL.
    Réponses: 7
    Dernier message: 05/11/2010, 19h03
  3. Réponses: 9
    Dernier message: 20/10/2010, 11h57
  4. Réponses: 3
    Dernier message: 08/03/2010, 14h36
  5. [XL-2003] supprimer des lignes qui ont les même valeurs
    Par Neptune64 dans le forum Excel
    Réponses: 1
    Dernier message: 09/08/2009, 01h30

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