如果我理解正确你的问题,如
1)管理用户......他们可以看看一切,因为他们将不得不在user_client表中没有记录。
2)客户主管......这样的主要责任人是特定的客户(或多个客户)。因此,用户在user_client表中有一个记录。如果是这样,那么只允许用户查看他们与之关联的客户的记录。
select
m.message_id,
m.client_id,
m.description,
c.name as clientName
from
(select count(*) as HasClients
from user_client
where user_id = TheUserYouWant) ClientCheck,
message m
left join user_client uc
on m.client_id = uc.client_id
AND uc.user_id = TheUserYouWant
join client c
on m.client_id = c.client_id
where
ClientCheck.HasClients = 0
OR NOT uc.user_id IS NULL
该查询查看user_client表TWICE。第一次只是对给定用户存在的那些记录进行计数,而不管与哪个客户端关联。查询将总是返回1行,它将为0(无此类记录),或者大于1(无论它们与多少个记录相关联)。
第二个实例是左连接到user_client表,只是在情况下,人员被限制为仅查看他们自己的客户端消息。
WHERE子句现在进入并说...如果客户端的基础计数为零,那么可以给我所有的消息。如果有任何其他值,则user_client表中的用户标识(作为客户和用户所需的消息的左连接)必须为EXIST(通过非user_id列的NULL值)。
现在,您可能不希望查询EVERY消息,因为它可能会随着数据库的增长而变得相当大,但是您可以在WHERE子句中添加任何其他条件,例如日期限制和/或客户端,你有兴趣
您能否显示您正在尝试修复的查询? – Alex 2015-02-23 17:37:08
你在这里?你会回答我的问题吗?并显示预期的结果? – Alex 2015-02-23 18:23:57
嗨,亚历克斯!刚刚看到你的消息。我没有完成查询,因为我意识到正在走错方向,我错过了一些东西。但是,这是我有什么: 选择 \t \t \t message.message_id, \t \t \t message.description \t \t FROM \t \t \t消息 \t \t WHERE \t \t \t discussionMessage.insertWhen> = DATE_SUB(NOW( ),INTERVAL 5 MINUTE) \t \t \t AND \t \t \t IF((SELECT COUNT(1)FROM user_client WHERE USER_ID = user.user_id)> = 1 \t \t \t \t \t \t message.clientId IN( \t \t \t \t SELECT \t \t \t \t \t CLIENT_ID \t \t \t \t FROM \t \t \t \t \t user_client \t \t \t \t WHERE \t \t \t \t \t user_client.userId = {} USERIDHERE \t \t \t),) – Kitara 2015-02-23 18:37:24