查询多对多关系

时间:2014-02-10 10:04:05

标签: mysql sql subquery

我需要一些帮助,请:)

我有

 ACCOUNTS
- account_id
- username
- password

USER_RIGHTS
- rights_id
- description
- level

有很多关系(所以我需要第三张桌子) USER_RIGHTS包含以下值:

1,'READ_ACCOUNTS',0
2,'CREATE_ACCOUNTS',1
3,'UPDATE_ACCOUNTS',2
4,'DELETE_ACCOUNTS',3
5,'READ_ORDERS',0
6,'CREATE_ORDERS',1
7,'UPDATE_ORDERS',2
8,'DELETE_ORDERS',3

我需要: - 一个返回所有无权删除任何内容的帐户的查询 - 返回具有最大用户权限数

的所有帐户的查询

谢谢!

2 个答案:

答案 0 :(得分:0)

CREATE TABLE accounts_2_user_rights
(
  id int
  account_id int
  rights_id int  
)

-- all without delete right
select *
from accounts acc
where not exists
(
  select 1
  from rights_user ru
  inner join accounts_2_user_rights a2ur
    on a2ur.rights_id = ru.rights_id
    and a2ur.account_id = acc.account_id
  where ru.description like 'DELETE%'
)

-- all maximum
select account_id, count(1)
from accounts acc
where exists(
  select 1
  from accounts_2_user_rights a2ur  
  inner join user_rights ur
    on ur.rights_id = a2ur.rights_id
  where a2ur.account_id = acc.account_id
  and count(1) = 9
)

答案 1 :(得分:0)

我建议你在SQLfiddle上创建一个例子。到现在为止,我只是告诉你该怎么做。如果你提供代码,我会提供代码。

基本上你没有对user_rights加入权做一个子查询来获取帐户ID并通过帐户提供查询。 这是伪代码:

select * from accounts where account_id in (
    select account_id from user_rights_per_account
    join user_rights on user_right_id = user_right_id
    where (your filter)
)

您可以不使用子查询,但这样您就不需要使用distinct。 如果需要进行聚合,可以执行另一个子查询。