mysql bit_and bit_or_深入理解bit_or和bit_and,bit_count

bit_or:二进制数按位或,bit_and:二进制数按位与,bit_count:统计二进制数1个个数

下面以一个例子来说明用法:

示例要实现的功能就是计算每月有几天有访问,先把示例摘录在这里。

1

2

3

4

5

6

7

-- 创建表

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

测试数据截图如下:

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 |

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

6 rows in set (0.01 sec)

从上面的数据可以看出,1月份有3天有访问,2月份有2天访问。如果用group by来计算,需要使用两次,笔者自己写了个sql语句:

1

2

3

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,day分组计算一次,将结果当成临时表再按照year,month分组计算一次。

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

1

2

SELECT year,month,BIT_COUNT(BIT_OR(1<

GROUP BY year,month;

bit_count函数的含义

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

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

此处针对1<

最后经过bit_or按位或后变成10000..(20个0)100,然后用bit_count统计2进制1的个数为2,非常巧妙

结果:

mysql> select year,month,bit_count(bit_or(1<

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

| year | month | days |

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

| 2000 | 01 | 3 |

| 2000 | 02 | 2 |

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

2 rows in set (0.00 sec)

此外,还可以对day使用distinct来去重,得出每月有访问的天数:

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

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

| year | month | count(distinct day) |

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

| 2000 | 01 | 3 |

| 2000 | 02 | 2 |

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

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

作者:峰之流觞

来源:CSDN

原文:https://blog.csdn.net/koli6678/article/details/79841153

版权声明:本文为

bit_or:二进制数按位或,bit_and:二进制数按位与,bit_count:统计二进制数1个个数

下面以一个例子来说明用法:

示例要实现的功能就是计算每月有几天有访问,先把示例摘录在这里。

1

2

3

4

5

6

7

-- 创建表

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

测试数据截图如下:

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 |

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

6 rows in set (0.01 sec)

从上面的数据可以看出,1月份有3天有访问,2月份有2天访问。如果用group by来计算,需要使用两次,笔者自己写了个sql语句:

1

2

3

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,day分组计算一次,将结果当成临时表再按照year,month分组计算一次。

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

1

2

SELECT year,month,BIT_COUNT(BIT_OR(1<

GROUP BY year,month;

bit_count函数的含义

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

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

此处针对1<

最后经过bit_or按位或后变成10000..(20个0)100,然后用bit_count统计2进制1的个数为2,非常巧妙

结果:

mysql> select year,month,bit_count(bit_or(1<

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

| year | month | days |

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

| 2000 | 01 | 3 |

| 2000 | 02 | 2 |

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

2 rows in set (0.00 sec)

此外,还可以对day使用distinct来去重,得出每月有访问的天数:

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

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

| year | month | count(distinct day) |

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

| 2000 | 01 | 3 |

| 2000 | 02 | 2 |

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

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

作者:峰之流觞

来源:CSDN

原文:https://blog.csdn.net/koli6678/article/details/79841153

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值