mysql中bit_count和bit_or函数的含义

翻阅mysql手册时,看到有个示例使用了bit_or方法来去除重复的数据,一开始没看明白,后来看明白之后感觉非常巧妙。示例要实现的功能就是计算每月有几天有访问,先把示例摘录在这里。

1
2
3
4
5
6
7
-- 创建表
CREATE TABLE t1 ( year YEAR (4), month INT (2) UNSIGNED ZEROFILL,
              day INT (2) UNSIGNED ZEROFILL);
 
-- 插入测试数据
INSERT INTO t1 VALUES (2000,1,1),(2000,1,20),(2000,1,30),(2000,2,2),
             (2000,2,23),(2000,2,23);

测试数据截图如下:

mysql中bit_count和bit_or函数测试

mysql中bit_count和bit_or函数测试

从上面的数据可以看出,1月份有3天有访问,2月份有2天访问。如果用group by来计算,需要使用两次,笔者自己写了个sql语句:

1
2
3
select year , month , count (0)
     from ( select year , month , day , count (0) from t1 group by year , month , day ) as tmp
     group by year , month ;

就是先按照year,month,day分组计算一次,将结果当成临时表再按照year,month分组计算一次。

官方手册上使用的这样的语句:

1
2
SELECT year , month ,BIT_COUNT(BIT_OR(1<< day )) AS days FROM t1
        GROUP BY year , month ;

咋一看不太明白了,后来弄清了bit_or和bit_count函数的含义后就豁然开朗了。

bit_count函数的含义

用来计算二进制数中包含1的个数。

1
select BIT_COUNT(10);

因为10转成二进制是1010,所以该结果就是2。

bit_or函数的含义

就是对两个二进制数进行或运算。如:

    1100
或  0101
--------------
    1101

上面例子中当计算2月份的访问天数时,

(1<< 02) | (1 << 23) | (1<<23) = 100 | 1000...(23个0)| 1000...(23个0) = 1000...100

再用bit_count一算就是2了,非常巧妙。

小结

上面使用了两种sql语句来实现这个功能,用distinct对天数去重也是可以实现该功能,只是3种sql语句哪个执行效率更快呢?


原文地址: http://www.01happy.com/mysql-bit_count-bit_or/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值