2016-12-12 8 views
2

私は試してみる前に、私がこれを正しく実行していることを確認したい。ジョインで弱い3つのテーブル間でデータを照会すること

USER      PERSONGROUPTOPERRSON   PERSONGROUPS 
    id      userId       groupID 
    firstName    groupId       groupName 
    lastName   
    lastUpdated 

私は、グループ名の「ボランティア」とのグループに属しているすべてのユーザーが必要になります。

は、私は3つのテーブルを持っています。

このクエリは正しいですか?

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

他の答えの1つに言及されているように、より直感的なエイリアスも良いアイデアです。 – 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%' 

3つのテーブルをすべて一緒に結合することです。内部結合でこれを簡単に行うことができます。共通鍵をリンクするだけです。たとえば、ユーザー表のユーザーIDフィールドは、personグループのpersonid表のuseridフィールドと一致します。次に、個人グループ表のグループIDフィールドは、個人グループ対個人テーブルのグループIDフィールドと一致します。それらをONステートメントとリンクします。

テーブルがリンクされたら、各行にユーザー情報とグループ情報が含まれていると考えることができます。したがって、where句は、そのグループ情報で探しているものを直接呼び出すことができます。

関連する問題