2010-07-06 62 views
1

我有兩個表:查找行具有所有鏈接的行

User (id, name, etc) 
UserRight (user_id, right_id) 

我想找誰有權1,2和3的用戶,但沒有誰的用戶只具有一個或兩個這些。此外,權限的數量也會有所不同,因此對(1,2,3)和(1,2,3,4,5,6,7)的搜索應該使用相同的查詢。

本質:

SELECT * 
FROM User 
WHERE (
    SELECT right_id 
    FROM tblUserRight 
    WHERE user_id = id 
    ORDER BY user_id ASC 
) = (1,2,3) 

在MySQL這可能嗎?

回答

3
SELECT u.id, u.name ... 
FROM User u 
JOIN UserRight r on u.id = r.user_id 
WHERE right_id IN (1,2,3) 
GROUP BY u.id, u.name ... 
HAVING COUNT DISTINCT(right_id) = 3 
0

在與我的回答錯誤對應關係指出,這裏有數量的解決方案和一個子查詢:

SELECT * 
FROM User 
WHERE 3 = (
    SELECT Count(user_id) 
    FROM tblUserRight 
    WHERE right_id IN (1,2,3) 
    AND user_id = User.id 
) 

優化器當然也可以將其更改爲馬丁·史密斯的解決方案(通過使用一組由IE) 。

+0

WHERE right_id IN(1,2,3),也給有隻有一個正確的ID的用戶,他希望right_id = 1和right_id = 2和right_id = 3 – 2010-07-06 11:39:03

+0

那不是什麼 'ALL'關鍵字無論如何。 – 2010-07-06 11:39:51

+0

順便說一下,當我第一次聽到'ALL'的時候,我仍然有同樣的感覺,但是我一直在努力思考什麼時候你真的需要使用它。 'expr> ALL()'會更好地寫成'expr> SELECT(MAX)...'等。 – 2010-07-06 11:57:04

0

您還可以使用PIVOT來做到這一點,特別是如果你想要一個可視化表示。我在SQL Server上做了這個 - 你可以翻譯它。

Declare @User Table (id Int, name Varchar (10)) 
Declare @UserRight Table (user_id Int, right_id Int) 

Insert Into @User Values (1, 'Adam') 
Insert Into @User Values (2, 'Bono') 
Insert Into @User Values (3, 'Cher') 

Insert Into @UserRight Values (1, 1) 
Insert Into @UserRight Values (1, 2) 
Insert Into @UserRight Values (1, 3) 
--Insert Into @UserRight Values (2, 1) 
Insert Into @UserRight Values (2, 2) 
Insert Into @UserRight Values (2, 3) 
Insert Into @UserRight Values (3, 1) 
Insert Into @UserRight Values (3, 2) 
--Insert Into @UserRight Values (3, 3) 


SELECT * 
FROM @User U 
    INNER JOIN @UserRight UR 
     ON U.id = UR.User_Id 
PIVOT 
(
    SUM (User_Id) 
    FOR Right_Id IN ([1], [2], [3]) 
) as xx 
WHERE 1=1 


SELECT * 
FROM @User U 
    INNER JOIN @UserRight UR 
     ON U.id = UR.User_Id 
PIVOT 
(
    SUM (User_Id) 
    FOR Right_Id IN ([1], [2], [3]) 
) as xx 
WHERE 1=1 
AND [1] IS NOT NULL 
AND [2] IS NOT NULL 
AND [3] IS NOT NULL 
相關問題