2008-11-12 9 views
3

Disons que nous avons ces tables;Requête SQL sans requêtes imbriquées

utilisateur de table:
- id
- nom d'utilisateur
- email

Table user2group:
- userid
- groupId

groupe table

:
- id
- nomdugroupe

Comment puis-je faire une requête qui renvoie à tous les utilisateurs et les groupes auxquels ils appartiennent (comme un tableau dans le ResultSet ou quelque chose ..)

Répondre

7
select u.id, u.username, u.email, g.groupid, g.groupname 
from user u 
join user2group ug on u.userid=ug.userid 
join group g on g.groupid=ug.groupid 
order by u.userid 

Comme vous Boucler dans le jeu de résultats, chaque fois que vous voyez un nouvel ID utilisateur crée un nouvel objet utilisateur (ou autre) et y ajoute les groupes.

3

La réponse d'Eric est géniale, mais j'utiliserais un LEFT JOIN au lieu d'un INNER pour obtenir des utilisateurs qui n'appartiennent à aucun groupe.

SELECT 
    u.id, 
    u.username, 
    u.email, 
    g.groupid, 
    g.groupname 
FROM 
    user u 
    LEFT JOIN user2group ug ON u.userid = ug.userid 
    LEFT JOIN group g ON g.groupid = ug.groupid 
ORDER BY 
    u.userid 
0

Les deux éléments ci-dessus sont plus ou moins corrects (dépendant si chaque utilisateur a un groupe ou non). Mais ils donneront aussi un jeu de résultats avec plusieurs entrées pour chaque utilisateur.

Il y a plusieurs façons de concaténer tous les membres du groupe en une seule virgule chaîne séparée, je vous suggère de lire à ce sujet ici: http://www.simple-talk.com/sql/t-sql-programming/concatenating-row-values-in-transact-sql/

Une autre méthode Personnellement, j'aime est d'utiliser des valeurs de bits au lieu de la table relationnelle user2group L'utilisateur de table obtient alors un groupe de champs int (ou bigint), et chaque ID de groupe reçoit une valeur de bit (par exemple: 1,2,4,8,16 et ainsi de suite) La valeur du champ de groupe de la table utilisateur est alors la somme de l'ID de groupe auquel il est affecté. Pour interroger si son groupe a un groupe: où (group AND groupID = groupID)

Questions connexes