位图记录的数据,统计每个位上的数据
select count(*) from (
select user_id,
right(concat('00000',bin(task_res)), 6) as b,
SUBSTRING(right(concat('00000',bin(task_res)), 6), 1,1) as zhucejianhangshenghuo,
SUBSTRING(right(concat('00000',bin(task_res)), 6), 2,1) as jianhangshenghuoxiaofei,
SUBSTRING(right(concat('00000',bin(task_res)), 6), 3,1) as weixinyinhang,
SUBSTRING(right(concat('00000',bin(task_res)), 6), 4,1) as longzhifu3,
SUBSTRING(right(concat('00000',bin(task_res)), 6), 5,1) as xinyongka66,
SUBSTRING(right(concat('00000',bin(task_res)), 6), 6,1) as longzhifu50
from tab_name where task_res>0
) as tab where weixinyinhang=1
解析
- 首先先将使用位图记录数据的字段转换为2进制,因为当前使用最多位数为6位,使用mysql 的bin方法转换时,转后的二进制不足6位的前面不会补0,因此,在前面使用字符串拼接的方式补0,然后再从右边截取6位,这样就可以获取到长度为6的二进制数据了
- 然后再将二进制字符串的每个位分解为单独的列,通过子查询的方式统计每个指标完成的数量即可
使用函数解析
1. bin(number)
将整形的数值类型字段转换为二进制
2. concat(string, string, ...)
将多个字符串拼接成一个字符串
3. right(string, number)
从右边截取字符串string,截取number个字符
4. SUBSTRING(string, startIndex, number)
截取字符串string,从第startIndex个字符开始截取,截取number个字符