zoukankan      html  css  js  c++  java
  • mysql中bit_count和bit_or函数的含义

    参考http://www.01happy.com/mysql-bit_count-bit_or/

    翻阅mysql手册时,看到有个示例使用了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);
    
    测试数据截图如下:
    
     
    mysql中bit_count和bit_or函数测试

    mysql中bit_count和bit_or函数测试

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

    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分组计算一次。

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

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

    小结

    上面使用了两种sql语句来实现这个功能,用distinct对天数去重也是可以实现该功能,只是3种sql语句哪个执行效率更快呢?

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

  • 相关阅读:
    Discuz 模板语句分析及知识技巧
    phpcms v9添加新模块
    simplexml 对xml的增删改操纵
    phpcms V9 相关阅读/相关文章
    怎么让php生成的网页源代码开头不出现空行
    phpcms v9 如何实现标签的嵌套
    在{pc:content action="lists"标签中加自定义限制条件的办法
    phpcms v9 内容页浏览数不显示问题
    【今日CV 视觉论文速览】29 Nov 2018
    【词云】wordcloud安装与使用
  • 原文地址:https://www.cnblogs.com/bpynfy/p/5728990.html
Copyright © 2011-2022 走看看