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>
)

2 réponses

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
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