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/

redis的setbit这个bit怎么理解,配合bitcount使用?

默认排序 Andy 如幻大千 惊鸿一瞥 13 人赞同了该回答 这个是SETB...
  • wojiuguowei
  • wojiuguowei
  • 2017年08月29日 14:36
  • 162

BitCount两种实现以及效率比较

算法概述输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。一、第一种实现 这也是比较多人使用的一种算法。 public static int bitCount(int i...
  • qq_26647927
  • qq_26647927
  • 2017年06月26日 22:51
  • 119

redis的setbit,getbit,bitcount的使用详解

可以先看下这篇文章,https://www.zhihu.com/question/27672245里面一定能解决你的大部分疑惑。 接着,我连上redis服务器。redis-cli -p 6383 (...
  • starryninglong
  • starryninglong
  • 2017年03月24日 13:06
  • 1325

Integer.bitCount(int i)原理

/** * Returns the number of one-bits in the two's complement binary * representation of th...
  • u012891380
  • u012891380
  • 2014年09月10日 19:24
  • 2586

统计一个字符串中bit为1的个数

今天遇到的一个问题,感觉自己的代码效率不高 编写一个函数,实现统计一个字符串中bit为1的个数#include int str_bit_count(char * p) { int coun...
  • yhj110911119
  • yhj110911119
  • 2016年09月22日 20:19
  • 591

使用redis的setbit和bitcount来进行区间统计的坑

以前听过一个bitmap做统计的分享,最近又看了文章“使用Redis bitmaps进行快速、简单、实时统计” 和 http://www.infoq.com/cn/articles/the-se...
  • dz45693
  • dz45693
  • 2017年03月11日 17:45
  • 1271

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

转自:http://blog.chinaunix.net/u/13991/showart_115947.html http://idning.iteye.com/blog/732769 代码:htt...
  • brandohero
  • brandohero
  • 2015年01月13日 00:03
  • 1197

Java源码 Integer.bitCount实现过程

public static int bitCount(int i) { // HD, Figure 5-2 i = i - ((i >>> 1) & 0x55555555); ...
  • u011042188
  • u011042188
  • 2016年12月18日 02:49
  • 2033

mysql的BIT_COUNT,BIT_COUNT

bit_count(expr):计算expr中“1”的个数,bit_count(2)-->1。                              bit_or(expr):就是对两个二进制...
  • beixiaohaizi
  • beixiaohaizi
  • 2016年01月26日 17:27
  • 429

MySQL中BIT_COUN和BIT_OR的使用

 Drop table if exists timeTable;CREATE TABLE timeTable ( year YEAR(4), month INT(2) UNSIGNED ...
  • java2000_net
  • java2000_net
  • 2009年02月02日 05:50
  • 3861
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:mysql中bit_count和bit_or函数的含义
举报原因:
原因补充:

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