Requête complexe

Pumbaa -  
 Pumbaa -
Bonjour, voici mon problème

J'ai une table User contenant un ID unique et un NOM (je simplifie au strict minimum)
et une table UserInfo contenant une clé étrangère (l'id de User), un champ CLE et un champ VALEUR.

Un User peut bien entendu avoir plusieurs UserInfo, et ce que j'aimerais, c'est une requête permettant de sélectionner le ou les User qui correspondent à une liste de pair CLE/VALEUR.

Par exemple :

User :
Id; Nom
_____________
1 ; User1
2 ; User2
3 ; User3

UserInfo :
USERID; CLE; VALEUR
__________________
1 ; CleA1; ValA1
1 ; CleA2; ValA2
2 ; CleA1; ValA1
2 ; CleB1; ValB1

J'aimerais que si je soumet une liste (CleA1/ValA1 ; CleA2/ValA2), ma requête me renvoie le User 1, c'est à dire le User qui contient toutes les pair clé/valeur que je lui donne.

Avez-vous une idée ?

Merci d'avance

Pumbaa

P.S.
Pour l'instant ma requête ressemble à ça, mais ça ne fonctionne évidemment que si on lui soumet une liste d'un seul élément :

select * from User where User.NOM in
(
select username
from User, UserInfos

where User.ID = UserInfos .USERID
<dynamic prepend="and">
<isNotEmpty property="listCleValeur" prepend="and">
<iterate property="listCleValeur" open="(" close=")" conjunction="and">
CLE = #listCleValeur[].cle#
and
VALEUR = #listCleValeur[].valeur#
</iterate>
</isNotEmpty>
</dynamic>
)
Configuration: Windows XP
Firefox 3.0.1

2 réponses

  1. Mikey_UFC Messages postés 315 Statut Membre 1
     
    Salut,

    Bizarre, cette 2ème table ( cle + valeur ), beaucoup de répétition du couple

    Sinon pour ta requête, désolé je ne connais pas trop le SQL dynamique mais en classique je ferais quelquechose du genre :

    SELECT nom, COUNT(cle) as nb_infos FROM USER
    INNER JOIN USERINFOS ON userid = id
    WHERE (cle=ta_premiere_cle AND valeur=ta_premiere_valeur)
    OR (cle=ta_deuxieme_cle AND valeur=ta_deuxieme_valeur)
    OR ....
    GROUP BY id
    HAVING nb_infos=le_nombre_d_infos_recherche

    ( plus 100% sûr de la syntaxe du HAVING peut-être HAVING COUNT(cle) = si l'alias ne marche pas)
    Si le couple cle/valeur est unique pour 1 user.

    ça devrait être faisable en dynamique.
    0
  2. Pumbaa
     
    Salut, et merci pour ta réponse.
    Ça marche nickel, mais en effet j'ai du modifier un peu le HAVING.

    La requête qui marche est

    select NOM
    from User
    inner join UserInfos on USERID = ID
    where (CLE='KEYA' and VALEUR='valA')
    or (CLE='KEYB' and VALEUR='valB')
    group by NOM
    having count(NOM) = 2
    0