SQL-每日一题【620.有趣的电影】

题目

某城市开了一家新的电影院,吸引了很多人过来看电影。该电影院特别注意用户体验,专门有个 LED显示板做电影推荐,上面公布着影评和相关电影描述。

作为该电影院的信息部主管,您需要编写一个 SQL查询,找出所有影片描述为非 boring (不无聊) 的并且 id 为奇数 的影片,结果请按等级 rating 排列。

例如,下表 cinema:

SQL-每日一题【620.有趣的电影】_第1张图片

对于上面的例子,则正确的输出是为:

SQL-每日一题【620.有趣的电影】_第2张图片 

 

解题思路

前置知识

位运算

由于位运算直接对内存数据进行操作,不需要转成十进制,因此处理速度非常快。

按位与(Bitwise AND),运算符号为&

a&b 的操作的结果:a、b中对应位同时为1,则对应结果位也为1、

例如:

SQL-每日一题【620.有趣的电影】_第3张图片

对10101100000000进行右移8位得到的是101011,这就得到了a的8~15位的掩码了。那么根据这个启示,判断一个整数是否是处于 0-65535 之间(常用的越界判断):

用一般的 (a >= 0) && (a <= 65535) 可能要两次判断。

改用位运算只要一次:

a & ~((1 << 16)-1)

后面的常数是编译时就算好了的。其实只要算一次逻辑与就行了。

             

常用技巧:

1、  用于整数的奇偶性判断

一个整数a, a & 1 这个表达式可以用来判断a的奇偶性。二进制的末位为0表示偶数,最末位为1表示奇数。使用a%2来判断奇偶性和a & 1是一样的作用,但是a & 1要快好多。

 

知道了位运算后,我们一起来看这道题

1.题目要求求出 所有影片描述为非 boring (不无聊) 的并且 id 为奇数 的影片,首先我们用位运算筛选出 id 为单数的影片,利用 id & 1,当 id 为单数时返回1,id 为偶数时返回 0。

2.筛选出 id 为单数的影片后,我们再对其进行筛选,找到 description 不等于 boring 的影片,最后按照 rating 进行降序排序,返回影片的全部信息即可。

代码实现

select * 
from cinema 
where id & 1
and  description != 'boring'
order by rating desc

测试结果

SQL-每日一题【620.有趣的电影】_第4张图片

 

你可能感兴趣的:(SQL每日一题,sql,数据库)