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 simple mais pourtant complexe


Sujet :

Langage SQL

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 4
    Points : 1
    Points
    1
    Par défaut Requete simple mais pourtant complexe
    Bonjour,

    Je suis désolé pour le titre, j'ai du mal à trouver une formulation correcte pour ce que je souhaite faire :s.

    Voici la structure de ma table : good_filtre
    object_id, brand_id, filtre_value_id (ce sont tous des int)

    et des exemples de donnée associé:

    1, 150, 2
    1, 150, 3
    15, 15, 3
    20, 45, 16
    44, 150, 3

    Alors voici mon probléme :
    J'aimerais récupéré, l'object_id si, le filtre_value_id est égale à 2 et à 3.
    J'avoue que je ne vois pas comment me passer d'un traitement php, puisqu'à l'heure actuelle tout ce que j'arrive à faire c'est à récupérer les object_id ayant comme filtre_value_id 2 ou 3.

    voici ma requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT  object_id
    FROM     good_filtre 
    WHERE    filtre_value_id IN (1,9)
    et je récupère donc :
    1
    1
    15
    44

    Alors que ce que je souhaiterais récupérer c'est uniquement :
    1

    J'espère que vous comprenez mon probléme (je ne trouve pas mon explication très clair).
    Merci d'avance pour votre temps et l'aide que vous pourrez m'apporter

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Bonjour,

    Vous pouvez utiliser la clause having :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT object_id
    FROM good_filtre
    WHERE filtre_value_id IN (2,3)
    GROUP BY object_id
    HAVING count(distinct filtre_value_id) = 2

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Bonjour,

    merci de votre réponse, malheureusement votre requête donne le résultat inverse de ce que je recherche :s

    Lorsque je l'utilise, elle me renvoie les object_id qui n'ont que le filtre_value_id égale à 2 et non ceux qui sont égale à 2 et à 3 :s

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Et pourtant, en reproduisant précisément votre exemple :
    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
    19
    20
    21
    22
    SQL> with good_filtre as
      2  (
      3  select 1 as object_id, 150 as brand_id, 2 as filtre_value_id from dual
      4  union all
      5  select 1, 150, 3 from dual
      6  union all
      7  select 15, 15, 3 from dual
      8  union all
      9  select 20, 45, 16 from dual
     10  union all
     11  select 44, 150, 3 from dual
     12  )
     13  SELECT object_id
     14  FROM good_filtre
     15  WHERE filtre_value_id IN (2,3)
     16  GROUP BY object_id
     17  HAVING count(DISTINCT filtre_value_id) = 2
     18  ;
     
     OBJECT_ID
    ----------
             1
    Précisez votre sgbd, la requête exacte que vous exécutez, le contenu de votre table, le retour, etc...

  5. #5
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    J'utilise postgresql

    voici la table :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    CREATE TABLE good_filtre
    (
      object_id integer NOT NULL,
      brand_id integer NOT NULL,
      filtre_value_id integer NOT NULL,
      CONSTRAINT good_filtre_pkey PRIMARY KEY (object_id, brand_id, filtre_value_id),
      CONSTRAINT good_filtre_good_fkey FOREIGN KEY (object_id, brand_id)
          REFERENCES good (object3d_id, brand_id) MATCH SIMPLE
          ON UPDATE NO ACTION ON DELETE NO ACTION,
      CONSTRAINT good_filtre_value_fkey FOREIGN KEY (filtre_value_id)
          REFERENCES filtre_values (id) MATCH SIMPLE
          ON UPDATE NO ACTION ON DELETE NO ACTION
    )

    Voici une partie des données :
    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
     
    24;1;1
    24;1;4
    28;1;1
    28;1;4
    28;1;9
    44;1;4
    45;1;1
    51;1;10
    79;1;11
    98;1;1
    98;1;4
    98;1;9
    100;1;1
    187;1;1
    187;1;9
    Voici la requête que j'utilise via celle que vous avez posté:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT object_id
    FROM good_filtre
    WHERE filtre_value_id IN (1,9)
    GROUP BY object_id
    HAVING count(DISTINCT filtre_value_id) = 1
    et pour finir voici le résultat que je récupère :


  6. #6
    Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2010
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Août 2010
    Messages : 44
    Points : 69
    Points
    69
    Par défaut
    Bonjour,

    Vous souhaitez obtenir la liste des object_id de la table good_filtre, sans doublon, et pour lesquels il existe une ligne avec une valeur de filtre_value_id = 2 et une ligne avec une valeur de filtre_value_id = 3.

    Je pense que la req. suivante doit répondre à cette question :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT distinct object_id
      FROM good_filtre
     WHERE filtre_value_id = 2
    INTERSECT
    SELECT distinct object_id
      FROM good_filtre
     WHERE filtre_value_id = 3
    Variante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT distinct gf1.object_id
      FROM good_filtre  gf1
     WHERE gf1.filtre_value_id = 2
         AND exists (SELECT 1 
                           FROM good_filtre gf2
                         WHERE gf2.filtre_value_id = 3
                             AND gf2.object_id = gf1.object_id)

    Cdlt,
    OD

  7. #7
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Super ça marche du tonnerre, j'ai vraiment eu du mal à vous expliquer mon probléme, je vous remercie tous pour votre temps

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    SELECT object_id
    FROM good_filtre
    WHERE filtre_value_id IN (1,9)
    GROUP BY object_id
    HAVING count(DISTINCT filtre_value_id) = 1
    Forcément, si vous modifiez de cette manière la requête que je vous ai fournie, ça risque pas de fonctionner

    Le "HAVING count(DISTINCT filtre_value_id) = 2" signifie qu'il va filtrer les résultats pour ne sortir que les object_id qui ont deux filtre_value_id distincts.
    Combiné au filtre WHERE filtre_value_id IN (1,9), on ne conservera bien que ceux qui ont les deux valeurs.

    Si vous remplacez par "HAVING count(DISTINCT filtre_value_id) = 1", vous conservez les résultats qui n'ont qu'une seule valeur de filtre_value_id parmi (1,9), ce qui ne correspond pas à ce que vous cherchez.

Discussions similaires

  1. Mapping tout simple mais pourtant
    Par inhib-- dans le forum Hibernate
    Réponses: 3
    Dernier message: 26/06/2008, 14h46
  2. [RegEx] Preg_replace si simple mais pourtant
    Par DeZanGe dans le forum Langage
    Réponses: 2
    Dernier message: 30/05/2008, 15h49
  3. [MySQL] requete simple mais pas d'affichage
    Par herve911 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 04/02/2008, 22h03
  4. Requete simple mais compliquée !
    Par mouatte dans le forum Requêtes
    Réponses: 2
    Dernier message: 21/12/2007, 23h13
  5. requete simple mais dure
    Par smedini dans le forum Requêtes
    Réponses: 1
    Dernier message: 26/11/2006, 00h50

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