获取分组记录 mysq 的值为 true 的单行

问题描述 投票:0回答:1

This is a sample data

id     role_id    permission_id      access_granted      user_id
------------------------------------------------------------------
1         1            10                  1               115
------------------------------------------------------------------
2         1            5                   1               115   
------------------------------------------------------------------
3         2            10                  0               115
------------------------------------------------------------------
4         2            8                   0               115
------------------------------------------------------------------

使用permission_id进行分组,对于重复的permission_id,结果应该具有值为true的行。正如我们所看到的,查询是按permission_id分组的,并且为permission_id 10选择了值为true的行,而对于其他行,权限id不会重复,因此值false被按原样选择。

预期结果应如下: (https://i.stack.imgur.com/eAdJT.png)

id     role_id    permission_id      access_granted      user_id
------------------------------------------------------------------
1         1            10                  1               115
------------------------------------------------------------------
2         1            5                   1               115   
------------------------------------------------------------------
3         2            8                   0               115
------------------------------------------------------------------

下面是我尝试获取上述结果的查询。

选择 id、role_id、permission_id、 max(access_granted) = true 则 true else false 结束为 access_granted, user_id 为 user_id
来自 temp_permission 组(按permission_id);

需要优化且真实的查询,在任何情况下都不会失败。

创建表查询

创建表 temp_permission ( id int auto_increment 主键, 角色_id int, 权限ID int, access_granted tinyInt(1), 用户 ID 整数 );

根据屏幕截图对表进行虚拟数据查询

插入

temp_permission
(
id
,
role_id
,
permission_id
,
access_granted
,
user_id
) 值 ('1', '1', '10', '1', '115'); 插入
temp_permission
(
id
,
role_id
,
permission_id
,
access_granted
,
user_id
) 值 ('2', '1', '5', '1', '115'); 插入
temp_permission
(
id
,
role_id
,
permission_id
,
access_granted
,
user_id
) 值 ('3', '2', '10', '0', '115'); 插入
temp_permission
(
id
,
role_id
,
permission_id
,
access_granted
,
user_id
) 值 ('4', '2', '8', '0', '115');

如果您无法将数据插入 access_granted 列,请替换 1 = b'1' & 0 = b'0'

mysql hibernate mysql-workbench go-gorm
1个回答
0
投票

您可以简单地根据

permission_id
access_granted
按降序排列行,然后根据
permission_id
选择不同的行。比如:

WITH ordered_rows AS (
  SELECT id, role_id, permission_id, access_granted, user_id,
         ROW_NUMBER() OVER (PARTITION BY permission_id ORDER BY access_granted DESC) as row_num
  FROM temp_permission
)
SELECT id, role_id, permission_id, access_granted, user_id
FROM ordered_rows
WHERE row_num = 1;
© www.soinside.com 2019 - 2024. All rights reserved.