现在有五张表 sys_menu,sye_role,_sys_role_menu,sys_user,sys_user_role查询每一个用户拥有多少个菜单
时间: 2023-08-10 21:04:15 浏览: 71
可以使用以下 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语句,具体的参数值需要在运行时传入。
java实现flink获取mysql多张表信息_Flink的sink实战之四:自定义
非常感谢您的提问!如果您想要在Flink中获取MySQL多张表的信息,可以按照如下步骤进行:
1. 首先需要在Flink中使用JDBC连接器连接MySQL数据库,并创建一个JDBC输入源,以便从MySQL中读取数据。
2. 然后可以通过Flink的Table API或SQL API将多张表的数据进行连接或者关联,从而得到您需要的数据。
3. 最后可以使用自定义的Sink将数据写入MySQL中。下面就是一个简单的Java代码示例,可以帮助您实现该功能:
```
public class FlinkMySQLSink {
public static void main(String[] args) throws Exception {
// set up the execution environment
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
// set up JDBC connection options
String url = "jdbc:mysql://localhost:3306/test";
String username = "root";
String password = "password";
String driverName = "com.mysql.jdbc.Driver";
// create a JDBC input source to read multiple tables from MySQL
JdbcInputFormat jdbcInputFormat = JdbcInputFormat.buildJdbcInputFormat()
.setDrivername(driverName)
.setDBUrl(url)
.setUsername(username)
.setPassword(password)
.setQuery("SELECT * FROM table1; SELECT * FROM table2;")
.finish();
// create a data stream from the JDBC input source
DataStream<Tuple2<String, String>> inputDataStream = env.createInput(jdbcInputFormat);
// use Table API or SQL API to join or combine multiple tables
Table table = inputDataStream
.map(new MapFunction<Tuple2<String, String>, Row>() {
public Row map(Tuple2<String, String> value) throws Exception {
return Row.of(value.f0, value.f1);
}
})
.toTable(new TableSchema(new String[]{"column1", "column2"}, new TypeInformation[]{Types.STRING, Types.STRING}));
// create a custom Sink to write data back to MySQL
JDBCOutputFormat jdbcOutputFormat = JDBCOutputFormat.buildJDBCOutputFormat()
.setDrivername(driverName)
.setDBUrl(url)
.setUsername(username)
.setPassword(password)
.setQuery("INSERT INTO result_table (column1, column2) VALUES (?, ?)")
.finish();
// write the data stream to the custom Sink
table.writeToSink(jdbcOutputFormat);
// execute the Flink job
env.execute("Flink MySQL Sink Example");
}
}
```
在这个示例中,我们首先设置了JDBC连接器所需的参数,然后使用JdbcInputFormat创建了一个JDBC输入源,该源可以从MySQL中读取多个表的数据。
接下来,我们使用Table API或SQL API将多个表的数据连接或者关联起来,并生成一个包含所需数据的Table对象。
最后,我们使用自定义的JDBCOutputFormat创建一个Sink,将Table中的数据写回到MySQL中。在这个Sink中,我们需要指定要写入哪个表,以及如何将数据映射到表中的列。
希望这个示例可以帮助您实现获取MySQL多张表信息的功能!