问题:我如何使用下面的架构获取未签署文档的用户列表,如果他们有文档中包含的角色?
背景
我有一个用户表。用户有角色。这是一个简单的设置:
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
但是 - 这是我不知道的难点:我如何使用上面的模式获取没有在文档上签名的用户列表,如果他们有一个文档中包含的角色?
答案 0 :(得分: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
;