程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> BIT_COUNT()和BIT_OR(),bit_countbit_or

BIT_COUNT()和BIT_OR(),bit_countbit_or

編輯:MySQL綜合教程

BIT_COUNT()和BIT_OR(),bit_countbit_or


在學習MySQL手冊時,看到根據天數計算訪問量時,出現了BIT_COUNT()和BIT_OR()兩個函數來處理天數計算的問題

所使用的表格信息如下:

mysql> select year,month,day from t1;

+------+-------+------+
| year | month | day  |
+------+-------+------+
| 2000 |    01 |   01 |
| 2000 |    01 |   20 |
| 2000 |    01 |   30 |
| 2000 |    02 |   02 |
| 2000 |    02 |   23 |
| 2000 |    03 |   13 |
| 2000 |    02 |   23 |
+------+-------+------+
7 rows in set (0.00 sec)

在處理這個問題時,起初我也沒有多想,無非是根據每個月的天數輸出訪問量,於是我做了如下的查詢:

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.02 sec)

但是,此時我發現2月份有兩個2月23日,這樣沒有去掉重復的天數,導致結果錯誤,看了手冊的查詢過程如下:

mysql> 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 |
| 2000 |    03 |    1 |
+------+-------+------+
3 rows in set (0.02 sec)

它使用了BIT_COUNT()和BIT_OR()兩個函數,這兩個函數的用法如下:

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,自動去除了重復的日期。

但是,我覺得這種使用2進制來進行計算的方法有些麻煩,我采用了一下的辦法來解決這個問題:

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

-> year,month;

+------+-------+-----+
| year | month | day |
+------+-------+-----+
| 2000 |    01 |   3 |
| 2000 |    02 |   2 |
| 2000 |    03 |   1 |
+------+-------+-----+
3 rows in set (0.02 sec)

其實這種方法也能解決這個問題,至少在我看來不必跳的那麼遠去解決這個問題。

--本篇文章轉自:http://www.cnblogs.com/yuyang-DataAnalysis/archive/2011/07/09/2101748.html

一句不懂的SQL語言

主要和你解釋下bit_count(bit_or(1<<day)) as days
統計天數 <<指遠遠小於
參考:
mujizi.javaeye.com/blog/326192
 

教一條SQL語句

遠遠小於
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved