2016-12-12 3 views
2

Просто хотел подтвердить, чтобы убедиться, что я делаю это прямо перед тем, как попробовать. Своеобразное слабое соединение.запрос данных между тремя таблицами

У меня есть три таблицы:

USER      PERSONGROUPTOPERRSON   PERSONGROUPS 
    id      userId       groupID 
    firstName    groupId       groupName 
    lastName   
    lastUpdated 

мне нужно все пользователи, которые принадлежат к группам с «добровольцем» в названии группы.

Был ли этот вопрос верным?

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%' 
    ); 
+1

Работает ли это при запуске? – TZHX

+0

Я еще не пробовал, по множеству причин. Вот почему я надеялся, что эксперты рассмотрят это, прежде чем я попробую. –

+1

Это просто оператор выбора, ничего плохого не может произойти, если вы запустите его, и он не работает. – Alicia

ответ

1
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%' 
+0

Более интуитивные псевдонимы также являются хорошей идеей, о чем упоминается один из других ответов. – Pops

1

Вы можете сделать это с помощью внутренних соединений. Я добавил, что в случае, если ваши пользователи могут быть в нескольких группах со словом «добровольцы» в нем. Я также рекомендую использовать более интуитивные псевдонимы для таблиц вместо 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%' 
1

Не совсем. Попробуйте следующее:

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

Идея состоит в том, чтобы объединить все три таблицы вместе. Вы можете сделать это довольно просто с помощью внутренних соединений. Вам просто нужно связать общие ключи. Так, например, поле идентификатора пользователя в таблице пользователя соответствует полю userid в таблице группы лиц для человека. Затем поле идентификатора группы в таблице групп лиц соответствует полю идентификатора группы в таблице «человек» для человека. Свяжите их с операторами ON.

Как только таблицы связаны, вы можете себе представить, что каждая строка содержит информацию о пользователе и информацию о группе. Таким образом, предложение where может напрямую вызывать то, что вы ищете в этой группе.

Смежные вопросы