+
 新版

sql语句:查询包含所有指定角色id的用户

苍之涛 发布于 2017/05/11 09:52
阅读 3K+
收藏 0

user表(id,username,password),role表(id,rolename),user_role表(uid,rid),要求根据给定的role id集合,查询所有包含这些role的用户列表,跟数据库无关。sql咋写,求指点

以下是问题补充:

@苍之涛:有个同事是使用exists去拼id,那样感觉sql太长,方法也太笨了点 (2017/05/11 10:46)
加载中
0
云天纵
云天纵

select username from user c inner join (

    select uid from user_role a inner join role b on a.rid = b.id where b.id = <input>

)  d  on c.id = d.uid

大概就是这样,欢迎大神指正,萌新一枚

苍之涛
这样不行吧,我的input是多个id
0
行者PHPer
行者PHPer
SELECT username FROM user AS u
INNER JOIN user_role AS ur
INNER JOIN role AS r
WHERE u.id = ur.uid
AND   ur.rid = r.id
AND   ur.rid IN (1,2,3,4);

 

苍之涛
我要的是同时满足,你这个是只要满足一个角色就ok了
0
confused_man
confused_man
select uid, group_concat('rid') as rids from user_role group by uid having rids = '1, 2, 3, 4'

先获取uid, 再取详细信息, 试试

苍之涛
你这个可能用作=好用,用作包含会有问题
风翔飞
风翔飞
如果需要的rid是1,3你就懵逼了
0
风翔飞
风翔飞

你的要求是全包含,所以条件就得是a&b&c这种,sql里多是模糊查询,所以sql这样可行

select uid, group_concat('rid') as rids from user_role group by uid having instr(rids,'1')>0 
and instr(rids,'2')>0 and instr(rids,'3')>0 ....

 

0
云天纵
云天纵
user       role     user_role  
id username password   id rolename   uid rid
1 a aaa   1 superadmin   1 2
2 b bbb   2 admin   2 1
3 c ccc   3 user   3 3
4 d ddd         4 1
                 
input <array> 1,2,3            
rs                
1 superadmin b,d            
2 admin a            
3 user c            

你想要的是最后这个rs的结果吧

0
风翔飞
风翔飞

数据太多的话可以在where里进行下筛选

select user_name from user u where exists(

select uid, group_concat('rid') as rids from user_role ur where rid in(1,2,3) and u.u_id=ur.uid group by ur.uid having instr(rids,'1')>0 and instr(rids,'2')>0 and instr(rids,'3')>0 ....)

苍之涛
这种方法不如用多个exists in好用,对比字符串很容易出问题
苍之涛
这是一种方法,我不太想拼sql,还有这里用到了mysql相关函数,想看看还有没有更好的办法。
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部