我的样本数据:

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
------------------------------------------------------------------

GROUP BY WITH PERMISSION_ID,并且结果中重复的PERMISSION_ID应该具有值TRUE ROW.正如我们可以看到的那样,查询是按照permission_id分组的,并且为permission_id 10 Select 了值为True的行,对于其他行,权限id没有重复,因此 Select 的值为False.

预期结果:

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

下面是我try 获取上述结果的查询.

select id, role_id, permission_id,
case when max(access_granted) = true then true else false end as access_granted,
user_id as user_id  
from temp_permission group by permission_id;

需要在任何情况下都不会失败的优化和可信的查询.

Create table query

CREATE TABLE temp_permission (
    id int auto_increment primary key,
    role_id int,
    permission_id int,
    access_granted tinyInt(1),
    user_id int
);

Dummy data query for the table as per the screenshot

INSERT INTO `temp_permission` (`id`, `role_id`, `permission_id`, `access_granted`, `user_id`) VALUES ('1', '1', '10', '1', '115');
INSERT INTO `temp_permission` (`id`, `role_id`, `permission_id`, `access_granted`, `user_id`) VALUES ('2', '1', '5', '1', '115');
INSERT INTO `temp_permission` (`id`, `role_id`, `permission_id`, `access_granted`, `user_id`) VALUES ('3', '2', '10', '0', '115');
INSERT INTO `temp_permission` (`id`, `role_id`, `permission_id`, `access_granted`, `user_id`) VALUES ('4', '2', '8', '0', '115');

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

推荐答案

您可以简单地根据permission_idaccess_granted对行进行降序排序,然后根据permission_id Select 不同的行.类似于:

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;

DB Fiddle

Mysql相关问答推荐

配置MySQL服务器以管理数千个表

如何让Docker MySQL使用Unicode(utf-8)和初始化脚本?

在联合查询中使用GROUP BY和ORDER BY

将值代入子查询

对具有依赖子查询结果的2列使用等式比较来优化连接

MySQL嵌套的内连接使查询变得很慢-解决方案?

将 JSON 类型的列与特定字符串值进行比较

如何更新一个巨大的表的 50k 行?

生成直到 10 的平方数序列

获取 TEXT 类型行的百分比

如何在更新表单中使用 group by?在 SQL 中

If else on WHERE 子句

MySQL计算特定值的列

如何使用 phpmyadmin 复制数据库?

如何在 MySQL 中为用户设置默认架构

在连接条件上使用 IS NULL 或 IS NOT NULL - 理论问题

仅在 MYSQL DATEDIFF 中显示小时数

什么是全文索引,我应该什么时候使用它?

更改 Laravel 的 created_at 和 updated_at 的名称

如何将具有相同列值的mysql行分组为一行?