使用了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了,非常巧妙。