2 votes

l'interrogation de données entre trois tables

Je voulais juste m'assurer que je faisais bien les choses avant d'essayer. Je suis un peu faible en ce qui concerne les raccordements.

J'ai trois tableaux :

USER                     PERSONGROUPTOPERRSON            PERSONGROUPS
    id                     userId                          groupID
    firstName              groupId                         groupName
    lastName          
    lastUpdated

J'ai besoin de tous les utilisateurs qui appartiennent à des groupes dont le nom contient "volunteer".

Cette requête est-elle correcte ?

SELECT
    a.firstName, a.lastName, a.lastUpdated
FROM
    user as a, persongrouptoperson as b
INNER JOIN ON
    a.id = b.userId
WHERE
    b.groupId
IN 
    (SELECT
        groupID
     FROM
        persongroups
     WHERE
        groupName like '%volunteer%'
     );

1voto

Pops Points 341
SELECT
    a.firstName, a.lastName, a.lastUpdated
FROM
    user as a
INNER JOIN  persongrouptoperson as b ON
    a.id = b.userId
INNER JOIN persongroups as c ON
    b.groupID = c.groupID
WHERE c.groupName like '%volunteer%'

1voto

SqlZim Points 31665

Vous pouvez le faire avec des jointures internes. J'ai ajouté distinct dans le cas où vos utilisateurs peuvent faire partie de plusieurs groupes contenant le mot bénévole. Je recommande également d'utiliser des alias plus intuitifs pour les tables au lieu de a, b, c.

select distinct
   u.firstName
 , u.lastName
 , u.lastUpdated
from User as u
  inner join PersonGroupToPerson as pgp on u.id = pgp.userId
  inner join PersonGroup as pg on pgp.groupId = pg.groupId
where pg.GroupName like '%volunteer%'

1voto

kbball Points 2690

Pas exactement. Essayez comme ceci :

SELECT user.firstname, user.lastname, user.lastupdated
FROM user
INNER JOIN persongrouptoperson ON user.id = persongrouptoperson.userid
INNER JOIN persongroups ON persongrouptoperson.groupid = persongroups.groupid
WHERE groupName like '%volunteer%'

L'idée est de réunir les trois tableaux. Vous pouvez le faire assez simplement avec des jointures internes. Il suffit de relier les clés communes. Par exemple, le champ "user id" de la table "user" correspond au champ "userid" de la table "person group to person". Ensuite, le champ "group id" de la table "person groups" correspond au champ "group id" de la table "person group to person". Reliez-les à l'aide d'instructions ON.

Une fois les tableaux liés, vous pouvez imaginer que chaque ligne contient les informations relatives à l'utilisateur et au groupe. Votre clause where peut donc appeler directement ce que vous recherchez dans ces informations de groupe.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X