2010-07-06 65 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 
相关问题