在查看MySQL 的一个手册的时候一直郁闷一个示例,折腾了很久,结果发现自己看错了,把BIT_OR 看成了BIT_XOR 。。。

题目大致是这样的:有一个日志表,记录了用户每次访问网站的一条记录

+------+-------+------+
| year | month | days |
+------+-------+------+

表示某一年某个月某天有访客访问,希望能够查询每个月网站被访问的总天数(同一天两次访问只算一天)

如果是一般的查询,我会这么做

SELECT year, month, COUNT(DISTINCT day)
FROM t1 GROUP BY year, month

但是手册里面提供了另外一种思路: 分组后将每一天放在位上,通过BIT_OR 合并相同的位,最后使用MySQL 提供的函数BIT_COUNT 计算出二进制有多少个位是1,那就是有多少天了

SELECT *, BIT_COUNT(BIT_OR(1 << day))
FROM GROUP BY year, month

发表评论

电子邮件地址不会被公开。 必填项已用*标注