MySQL8.0.12 bit_and bit_or bit_xor

版权声明:本文为博主原创文章,转载请注明出处 https://blog.csdn.net/vkingnew/article/details/82689712
MySQL本身对于位运算有与或非的专属符号 & | ^
在MySQL中提供了bit_and、bit_or、bit_xor的分组函数。

此外MySQL还提供了bit_count函数用以统计二进制中含有1的个数。
mysql> select bit_count(10);
+---------------+
| bit_count(10) |
+---------------+
|             2 |
+---------------+
1 row in set (0.00 sec)

mysql> select bit_count(b'1010');
+--------------------+
| bit_count(b'1010') |
+--------------------+
|                  2 |
+--------------------+
1 row in set (0.00 sec)



bit_or:二进制数按位或,bit_and:二进制数按位与,bit_count:统计二进制数1个个数。

应用统计:
mysql> create table visituser(id bigint unsigned not  null auto_increment primary key,userid int,brokerid int,y int,m int(2) unsigned zerofill,d int(2) unsigned zerofill);
Query OK, 0 rows affected (0.04 sec)

mysql> insert into visituser(userid,brokerid,y,m,d)values(1000,1,2018,8,1),(1000,2,2018,8,15),(1000,2,2018,8,21),(1002,1,2018,9,1),(1002,1,2018,9,16),(1000,2,2018,9,20),(1000,2,2018,9,25),(1000,2,2018,9,25);
Query OK, 7 rows affected (0.02 sec)
Records: 7  Duplicates: 0  Warnings: 0


select y,m,count(distinct d) days from visit  group by y,m;

select y,m,bit_count(bit_or(1<<d)) days from visit  group by y,m;
select y,m,userid,brokerid,bit_count(bit_or(1<<d)) days from visituser  group by y,m,userid,brokerid;


mysql> select y,m,userid,brokerid,bit_count(bit_or(1<<d)) days from visituser  group by y,m,userid,brokerid;
+------+------+--------+----------+------+
| y    | m    | userid | brokerid | days |
+------+------+--------+----------+------+
| 2018 |   08 |   1000 |        1 |    1 |
| 2018 |   08 |   1000 |        2 |    2 |
| 2018 |   09 |   1002 |        1 |    2 |
| 2018 |   09 |   1000 |        2 |    2 |
+------+------+--------+----------+------+
4 rows in set (0.01 sec)

count(distinct d)
mysql> select y,m,userid,brokerid,count(distinct d) days from visituser  group by y,m,userid,brokerid;


mysql> select y,m,userid,brokerid,count(distinct d) days from visituser  group by y,m,userid,brokerid;
+------+------+--------+----------+------+
| y    | m    | userid | brokerid | days |
+------+------+--------+----------+------+
| 2018 |   08 |   1000 |        1 |    1 |
| 2018 |   08 |   1000 |        2 |    2 |
| 2018 |   09 |   1000 |        2 |    2 |
| 2018 |   09 |   1002 |        1 |    2 |
+------+------+--------+----------+------+
4 rows in set (0.03 sec)


解释:
此处针对1<<d 进行解释:这里的计数采取的是位图法,每天有访问就用1表示,02天表示100,23表示1000..(23个0)。
最后经过bit_or按位或后变成10000..(20个0)100,然后用bit_count统计二进制1的个数,非常巧妙。

猜你喜欢

转载自blog.csdn.net/vkingnew/article/details/82689712
BIT
今日推荐