Skip to content

Latest commit

 

History

History
123 lines (89 loc) · 3.07 KB

File metadata and controls

123 lines (89 loc) · 3.07 KB
comments difficulty edit_url tags
true
中等
数据库

English Version

题目描述

表:user_permissions

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| user_id     | int     |
| permissions | int     |
+-------------+---------+
user_id 是主键。
这张表的每一行包含用户 ID 和他们的权限,编码为一个整数。

permissions 整数中的每一个二进制位代表一个用户拥有的一个不同的访问级别或功能。

编写一个解决方案来计算以下内容:

  • common_perms:授予 所有用户 的访问级别。在 permissions 列上使用 按位与 操作来计算。
  • any_perms:授予 任一用户 的访问级别。在 permissions 列上使用 按位或 操作来计算。

以 任意 顺序返回结果表。

结果格式如下所示。

 

示例:

输入:

user_permissions 表:

+---------+-------------+
| user_id | permissions |
+---------+-------------+
| 1       | 5           |
| 2       | 12          |
| 3       | 7           |
| 4       | 3           |
+---------+-------------+
 

输出:

+-------------+--------------+
| common_perms | any_perms   |
+--------------+-------------+
| 0            | 15          |
+--------------+-------------+
    

解释:

  • common_perms: 代表所有权限的按位与结果:
    <ul>
    	<li>对于用户 1 (5): 5 (二进制 0101)</li>
    	<li>对于用户 2 (12): 12 (二进制 1100)</li>
    	<li>对于用户 3 (7): 7 (二进制 0111)</li>
    	<li>对于用户 4 (3): 3 (二进制 0011)</li>
    	<li>按位与:5 &amp; 12 &amp; 7 &amp; 3 = 0 (二进制 0000)</li>
    </ul>
    </li>
    <li><strong>any_perms:</strong> 代表所有权限的按位或结果:
    <ul>
    	<li>按位或:5 | 12 | 7 | 3 = 15 (二进制 1111)</li>
    </ul>
    </li>
    

解法

方法一:位运算

我们可以使用 BIT_ANDBIT_OR 函数来计算 common_permsany_perms

MySQL

# Write your MySQL query statement below
SELECT
    BIT_AND(permissions) AS common_perms,
    BIT_OR(permissions) AS any_perms
FROM user_permissions;