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<<
day
))
as
days
from
t1
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《此外,還可以對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 |
+------+-------+---------------------+
2 rows in set (0.01 sec)
深入理解C語言 深入理解指標
關於指標,其是c語言的重點,c語言學的好壞,其實就是指標學的好壞。其實指標並不複雜,學習指標,要正確的理解指標。指標也是一種變數,占有記憶體空間,用來儲存記憶體位址 指標就是告訴編譯器,開闢4個位元組的儲存空間 32位系統 無論是幾級指標都是一樣的 p操作記憶體 在指標宣告時,號表示所宣告的變數為指...
mysql 索引深入理解 深入理解MySql的索引
為什麼索引能提高查詢速度 先從 mysql的基本儲存結構說起 mysql的基本儲存結構是頁 記錄都存在頁裡邊 各個資料頁可以組成乙個雙向鍊錶每個資料頁中的記錄又可以組成乙個單向鍊錶 每個資料頁都會為儲存在它裡邊兒的記錄生成乙個頁目錄,在通過主鍵查詢某條記錄的時候可以在頁目錄中使用二分法快速定位到對應...
深入理解C語言 深入理解指標
關於指標,其是c語言的重點,c語言學的好壞,其實就是指標學的好壞。其實指標並不複雜,學習指標,要正確的理解指標。指標也是一種變數,占有記憶體空間,用來儲存記憶體位址 指標就是告訴編譯器,開闢4個位元組的儲存空間 32位系統 無論是幾級指標都是一樣的 p操作記憶體 在指標宣告時,號表示所宣告的變數為指...