- 论坛徽章:
- 9
|
下面的例子显示了如何使用位组函数来计算每个月中用户访问网页的天数。
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
中的”BIT_COUNT(BIT_OR(1
“用法比较有技巧。
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,自动去除了重复的日期。
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/90603/showart_2000854.html |
|