mysql中bit_count和bit_or函数的含义

  

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

-- 创建表
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),(2000,3,11);


测试数据截图如下:


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_COUNTBIT_OR方法:

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

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

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


bit_count函数的含义

用来计算二进制数中包含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了,非常巧妙。


你可能感兴趣的:(mysql,bit_count)