我正在考虑以下两个表格
|------------| |-----------|
| user_roles | | roles |
|============| |===========|
| user_id | | role_id |
| role_id | | code_name |
|------------| |-----------|
我要获取给定用户id列表中用户id所在的所有用户角色。但我想排除所有拥有代码为“特殊角色”的角色的用户。
最好的办法是什么?
举个例子,假设我有以下几点:
user_roles: roles:
| user_id | role_id | | role_id | code_name |
|=========|=========| |=========|==============|
| 1 | 1 | | 1 | special_role |
| 1 | 2 | | 2 | another_role |
| 2 | 2 | |---------|--------------|
| 3 | 2 |
|---------|---------|
我的想法是使用临时表,比如:
create temporary table if not exists all_user_ids as (
select ur.user_id as user_id, ur.role_id as role_id
from user_roles ur
where ur.user_id in (1,2,3)
);
create temporary table if not exists special_user_ids as (
select aui.user_id as user_id
from all_user_ids aui
join roles r on r.role_id = aui.role_id
where r.code_name = 'special_role'
);
create temporary table if not exists non_special_user_ids as (
select aui.user_id as user_id
from all_user_ids aui
where aui.user_id not in (special_user_ids.user_id)
);
最后的结果是:
select ur.user_id, ur.role_id
from user_roles ur
where ur.user_id in (non_special_user_ids.user_id)
但一定有更好的办法?!
3条答案
按热度按时间ego6inou1#
您可以使用窗口函数-如果您运行的是mysql 8.0:
在早期版本中,一种方法是
not exists
:kulphzqa2#
加入吧。这应该是相当快的假设你有钥匙设置。
误解了提问。如果您不希望任何用户具有特殊角色:
dsekswqp3#
使用
IN
以及NOT IN
对于两种情况:请看演示。