mysql中bit_count和bit_or函数的含义

转载 2016年05月30日 16:13:18

翻阅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/

七种bit count快速计算方法比较

转自:http://blog.chinaunix.net/u/13991/showart_115947.html http://idning.iteye.com/blog/732769 代码:htt...

Fast bit count问题(即计算一个unsigned int的二进制表达中1的数目)

最近在看《Programming Pearls》。里面的好些问题很有意思。做一点小小的总结吧。 这个问题是计算一个unsigned int型二进制数中一个的个数,google中看到了不少很巧妙的...

同余模方程--BIT 1053 Han Xin Count Soldiers

用了2天多,尼玛的,幸好有ZY大神讲解及 对代码调试助攻。。自己程序太渣,还是上ZY代码吧。。 Han Xin Count Soldiers 时间限制: 1秒  内存限制: 64M ...

Implementing Address Windowing Extensions (AWE) or VLM on 32-bit Windows Platforms [ID 225349.1]

Applies to: Oracle Server - Enterprise Edition Microsoft Windows (32-bit) Purpose To address th...

The JAVA_HOME environment variable does not point to a working 32-bit JDK or JRE.

今天在打包Java程序的时候,报如下错误:The JAVA_HOME environment variable does not point to a working 32-bit JDK or JR...

『Linux』Linux X64 安装32Bit软件提示ld-linux.so.2 No such file or directory

原文地址:Linux X64 安装32Bit软件提示ld-linux.so.2 No such file or directory 问题现象: /usr/local/bin/s...

分治法 or BIT 求逆序对

方法1: 求逆序对可以利用归并排序来求,其实就是分治。 归并排序在排序过程很中对于一样的数比较是不会改变次序的,因而可以用来求逆序对。 代码如下: 1 #include 2 3 void ...

spoj DQUERY - D-query(区间不同数的个数 主席树 or BIT)

题目链接 给出含有n个数字的序列,每次问区间[l,r]不同数的个数。 可以用主席树也可以用树状数组,做法都是同一个原理。从左往右扫一遍,记录每个数上一次出现的位置。当扫到i位置时, 把...

GeoDa_32or64Bit_V1.6.2

  • 2014年09月04日 23:02
  • 34.42MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:mysql中bit_count和bit_or函数的含义
举报原因:
原因补充:

(最多只允许输入30个字)