如何查找与过滤条件中给出的每个值匹配的所有行?

时间:2012-04-30 00:33:04

标签: mysql sql

我有useruser_role个表。

user_role表有两列:

user_id
role_name

我想找到同时拥有多个角色的用户,例如“ admin ”和“主持人”。

如何构建此查询?

2 个答案:

答案 0 :(得分:3)

以下查询使用LEFT OUTER JOIN加入表useruser_role,以查找属于admin和管理员的所有用户。然后,它会通过在role_name上找到 DISTINCT 计数来过滤属于管理员和管理员角色的用户。如果添加其他角色,则应相应更改HAVING子句中使用的值2.

Click here to view the demo in SQL Fiddle.

脚本

CREATE TABLE user
(
    user_id     INT         NOT NULL
  , user_name   VARCHAR(20) NOT NULL
);

CREATE TABLE user_role
(
    user_id     INT         NOT NULL
  , role_name   VARCHAR(20) NOT NULL
);

INSERT INTO user (user_id, user_name) VALUES
    (1, 'user 1'),
    (2, 'user 2'),
    (3, 'user 3'),
    (4, 'user 4'),
    (5, 'user 5'),
    (6, 'user 6');

INSERT INTO user_role (user_id, role_name) VALUES
    (1, 'admin'),
    (1, 'moderator'),
    (3, 'moderator'),
    (2, 'admin'),
    (5, 'admin'),
    (2, 'moderator'),
    (5, 'admin'),
    (4, 'moderator'),
    (4, 'moderator');

SELECT          u.user_id
            ,   u.user_name
FROM            user        u
LEFT OUTER JOIN user_role   ur
ON              ur.user_id  = u.user_id
WHERE           ur.role_name IN ('admin', 'moderator')
GROUP BY        u.user_id
HAVING          COUNT(DISTINCT ur.role_name) = 2;

输出

USER_ID USER_NAME 
------- ---------
   1    user 1
   2    user 2

答案 1 :(得分:0)

您需要两个联接,一个用于过滤管理员,另一个用于主持人:

SELECT user.*
FROM user
INNER JOIN user_role admins
ON admins.user_id = user.id
AND admins.role_name = 'admin'
INNER JOIN user_role mods
ON mods.user_id = user.id
AND mods.role_name = 'moderator'