mysql bit_count / bit_or

本文展示了如何利用位组函数计算每个月用户访问网页的天数,并通过SQL查询实现自动化去除重复日期。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

下面的例子显示了如何使用位组函数来计算每个月中用户访问网页的天数。

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 );

示例表中含有代表用户访问网页的年-月-日值。可以使用以下查询来确定每个月的访问天数:

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

GROUP BY year , month ;

将返回:

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

| year | month | days |

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

| 2000 | 01 | 3 |

| 2000 | 02 | 2 |

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

该查询计算了在表中按年 / 月组合的不同天数,可以自动去除重复的询问。
上面例子中的查询语句:

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


中的”BIT_COUNT(BIT_OR(1<<day))

“用法比较有技巧。

1、BIT_COUNT( expr ):返回 expr 的二进制表达式中”1“的个数。
例如:29 = 11101 则:BIT_COUNT(29)= 4;
2、BIT_OR( expr ):返回 expr 中所有比特的bitwise OR。计算执行的精确度为64比特(BIGINT) 。

例如:上面例子中,2000年02月中有一条2号的记录两条23号的记录,所以"1<<day"表示出来就是 “1<<2”和“1<<23”,得到二进制数 100 和 100000000000000000000000 。然后再OR运算。即 100 OR 10000000000000000000000 OR 10000000000000000000000 = 100000000000000000000100;这样再用BIT_COUNT处理得出的值就是2,自动去除了重复的日期。

forwarded from : http://bbs.chinaunix.net/archiver/?tid-1510005.html
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值