现在有五张表 sys_menu,sye_role,_sys_role_menu,sys_user,sys_user_role查询每一个用户拥有多少个菜单
时间: 2023-08-10 16:04:15 浏览: 202
可以使用以下 SQL 语句查询每一个用户拥有多少个菜单:
```
SELECT su.username, COUNT(sm.menu_id) AS menu_count
FROM sys_user su
LEFT JOIN sys_user_role sur ON su.user_id = sur.user_id
LEFT JOIN sys_role sr ON sur.role_id = sr.role_id
LEFT JOIN sys_role_menu srm ON sr.role_id = srm.role_id
LEFT JOIN sys_menu sm ON srm.menu_id = sm.menu_id
GROUP BY su.username;
```
该语句使用了左连接(LEFT JOIN)和分组(GROUP BY)操作。首先将 `sys_user` 表与 `sys_user_role` 表进行左连接,然后将 `sys_role` 表与 `sys_role_menu` 表进行左连接,最后将 `sys_menu` 表与 `sys_role_menu` 表进行左连接。这样可以获取每一个用户拥有的所有菜单的信息。
然后使用 GROUP BY 操作将结果按照用户名进行分组,并使用 COUNT 聚合函数计算每一个用户拥有的菜单数量。最终返回每一个用户的用户名和菜单数量。
相关问题
SELECT DISTINCT m.`perms` FROM sys_user_role ur LEFT JOIN `sys_role` r ON ur.`role_id` = r.`id` LEFT JOIN `sys_role_menu` rm ON ur.`role_id` = rm.`role_id` LEFT JOIN `sys_menu` m ON m.`id` = rm.`menu_id` WHERE user_id = #{userId} AND r.`status` = 0 AND m.`status` = 0
这是一段 SQL 查询语句,作用是查询指定用户ID所拥有的所有权限perms。具体的查询逻辑是,先通过sys_user_role表和sys_role表获取该用户所属的所有角色,然后通过sys_role_menu表和sys_menu表获取每个角色所对应的菜单ID,最后通过菜单ID获取每个菜单对应的权限perms。其中,通过LEFT JOIN关键字实现了多张表之间的联接查询,通过DISTINCT关键字去重,通过status字段过滤掉已经被禁用的角色和菜单。需要注意的是,该查询语句是使用了占位符(#{userId})的MyBatis动态SQL语句,具体的参数值需要在运行时传入。
select mon,name,avg(days) '人均月活天数' from ( select DATE_FORMAT(l.create_time,'%Y-%m') mon,o.name,l.userid,count(distinct DATE_FORMAT(l.create_time,'%y-%m-%d')) days from sys_log l,sys_user s,basic_tm_organize o,sys_user_depart up ,sys_depart p where l.log_content like '%登录成功%' and s.organize_id = o.id and l.userid = s.username and l.create_time > '2021-11-01 00:00:00' and up.dep_id = p.id and up.user_id = s.id and p.depart_name != '智库事业部' group by DATE_FORMAT(create_time,'%Y-%m'),l.userid,o.name ) z group by mon,name ;请解释一下这段SQL
这段SQL查询的是一个系统的用户活跃度,通过统计每个用户在每个月内的登录天数来计算其活跃度。具体解释如下:
1. 外层查询语句:
```
select mon,name,avg(days) '人均月活天数'
```
查询结果包括三列,分别是月份(mon)、部门名称(name)和人均月活天数(avg(days))。
2. 内层查询语句:
```
select DATE_FORMAT(l.create_time,'%Y-%m') mon,o.name,l.userid,count(distinct DATE_FORMAT(l.create_time,'%y-%m-%d')) days
from sys_log l,sys_user s,basic_tm_organize o,sys_user_depart up ,sys_depart p
where l.log_content like '%登录成功%'
and s.organize_id = o.id
and l.userid = s.username
and l.create_time > '2021-11-01 00:00:00'
and up.dep_id = p.id
and up.user_id = s.id
and p.depart_name != '智库事业部'
group by DATE_FORMAT(create_time,'%Y-%m'),l.userid,o.name
```
这里进行了多表关联查询,包括sys_log、sys_user、basic_tm_organize、sys_user_depart和sys_depart五张表,查询条件为:
- 日志内容包括“登录成功”;
- 用户属于某个组织机构;
- 日志记录的用户ID与用户表中的用户名相同;
- 日志记录时间在2021年11月1日之后;
- 用户所在部门不是“智库事业部”。
查询结果包括四列,分别是月份(mon)、部门名称(name)、用户ID(userid)和该用户在该月内的登录天数(days)。
3. 整个查询语句:
```
select mon,name,avg(days) '人均月活天数' from (内层查询语句) z group by mon,name ;
```
这里使用了内层查询语句作为子查询,然后按照月份和部门名称分组,计算每个部门每个月的人均月活天数。
阅读全文