3

質問: 以下のスキーマを使用して、ドキュメントに含まれる役割を持っている場合、ドキュメントをサインオフしていないユーザーのリストを取得するにはどうすればよいですか?

バックグラウンド:

ユーザーテーブルがあります。ユーザーには役割があります。それは簡単なセットアップです:

Role table:           Role_ID | Name
User table:           User_ID | Name
Users_Roles table:    User_ID | Role_ID

次に、Documents テーブルを追加する必要があります。

Documents table:  Document_ID | Name

ユーザーがドキュメントをいつサインオフしたかを知る必要があります。

Documents_Users table: User_ID | Document_ID

ここまではかなり単純です。

しかし、今では難しくなっています。ドキュメントに制限を追加する必要があるため、ドキュメントを複数のロールに割り当てることができます。

つまり、Document_ID 1 は Role_ID (3,4,5) 用です。

する必要があると思います

Documents_Roles table: Role_ID | Document_ID

しかし、ここに私が知らない難しい部分があります: 上記のスキーマを使用して、ドキュメントに含まれるロールを持っている場合、ドキュメントをサインオフしていないユーザーのリストを取得するにはどうすればよいですか?

4

1 に答える 1

1

あなたの構造は正しいです:

SELECT Users_Roles.User_ID, Documents_Roles.Document_ID
FROM Documents_Roles -- get some documents
-- JOIN Documents ON (Documents.Document_ID = Documents_Roles.Document_ID) -- if you need details from the Documents table
JOIN Users_Roles USING (Role_ID) -- get all users expected to sign them
-- JOIN Users ON (Users.User_ID = Users_Roles.User_ID) -- if you need details from the Users table
LEFT JOIN Documents_Users ON
    Documents_Users.Document_ID = Documents_Roles.Document_ID AND
    Documents_Users.User_ID = Users_Roles.User_ID -- find whether they have signed it
WHERE
    Documents_Users.User_ID IS NULL -- only those expected users who have *not* signed it
    -- AND Documents_Roles.Document_ID = some_id
;
于 2013-07-11T15:14:31.183 に答える