Requête complexe
Pumbaa
-
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>
)
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>
)
A voir également:
- Requête complexe
- Tableau complexe word - Guide
- Quelle requête écrire pour demander au moteur de recherche de présenter de préférence les pages web traitant de tennis mais pas de tennis de table ✓ - Forum Android
- Problème de requête ✓ - Forum Java
- Requête bloquée par le pare-feu applicatif claranet webfence ✓ - Forum Réseaux sociaux
- L'opérateur ou l'administrateur a refusé la requête ✓ - Forum Windows
2 réponses
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.
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.