2014-02-10 54 views
-1

我需要一些幫助,請:)查詢在多對多的關係

ACCOUNTS 
- account_id 
- username 
- password 

USER_RIGHTS 
- rights_id 
- description 
- level 

有多對多的關係(所以我需要一個第三個表) 的USER_RIGHTS包含這些valuse :

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 

我需要: - 一個查詢,返回所有帳戶沒有刪除任何權- 返回擁有最大用戶權限數的所有帳戶的查詢

謝謝!

+1

那麼,這不是「我們爲你做你的工作」網站。顯示你已經嘗試了什麼,以及問題出在哪裏。從 – fancyPants

+0

選擇a.username賬戶 左外連接ACCOUNTS_RIGHTS AR上a.account_id = ar.account_id 左外連接USER_RIGHTS烏爾上ar.rights_id = ur.rights_id 其中ur.rights_id不是(4,8) 組由a.username 這是爲第一個查詢 - 但例如在ACCOUNTS_RIGHTS如果我有用戶1 - 權利1和用戶1 - 權利4它會返回它,我不希望:| – alex1111

回答

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 
) 
+0

謝謝你的第一個,但所有最大值都不好,它說非法使用了一個聚合函數 – alex1111

+0

好吧,我沒有真正測試它,它的一種僞代碼。您可以跳過存在,只是在where中使用子查詢。類似於(...)where(SELECT COUNT(1)(...))= 9。或使用GROUP BY並使用HAVING關鍵字。 – GercoOnline

0

我建議你在SQLfiddle上創建一個例子。到現在爲止,我只是告訴我該怎麼做。如果您提供代碼,我會提供代碼。

Basicaly你生病做一個子查詢通過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) 
) 

你可以不這樣做的子查詢,但這樣一來,你就不需要使用不同。 如果你需要做一個聚合,你可以做另一個子查詢。