mysql bitcount_mysql中bit_count和bit_or函数的含义

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

测试数据截图如下:

mysql> select * from t1;

+------+-------+------+

| year | month | day  |

+------+-------+------+

| 2000 |    01 |   01 |

| 2000 |    01 |   20 |

| 2000 |    01 |   30 |

| 2000 |    02 |   02 |

| 2000 |    02 |   23 |

| 2000 |    02 |   23 |

| 2000 |    03 |   11 |

+------+-------+------+

7 rows in set (0.00 sec)

从上面的数据可以看出,1月份有3天有访问,2月份有2天访问,3月份有1天访问。

计算每月有几天有访问,实现方法如下:

一、使用count方法:

做了如下的查询:

mysql> select year,month,count(day) as day from t1 group by year,month;

+------+-------+-----+

| year | month | day |

+------+-------+-----+

| 2000 |    01 |   3 |

| 2000 |    02 |   3 |

| 2000 |    03 |   1 |

+------+-------+-----+

3 rows in set (0.00 sec)

结果发现2月份有两个2月23日,这样没有去掉重复的天数,导致结果错误;

如果使用两次group by来计算,sql语句如下:

mysql> 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 | count(0) |

+------+-------+----------+

| 2000 |    01 |        3 |

| 2000 |    02 |        2 |

| 2000 |    03 |        1 |

+------+-------+----------+

3 rows in set (0.00 sec)

结果正确,但过于麻烦。

二、使用BIT_COUNT和BIT_OR方法:

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

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

bit_count函数的含义

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

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

bit_or函数的含义

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

1100

或  0101

--------------

1101

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

(1<

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值