位图记录的数据,统计每个位上的数据

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

解析

  1. 首先先将使用位图记录数据的字段转换为2进制,因为当前使用最多位数为6位,使用mysql 的bin方法转换时,转后的二进制不足6位的前面不会补0,因此,在前面使用字符串拼接的方式补0,然后再从右边截取6位,这样就可以获取到长度为6的二进制数据了
  2. 然后再将二进制字符串的每个位分解为单独的列,通过子查询的方式统计每个指标完成的数量即可

使用函数解析

1. bin(number)
将整形的数值类型字段转换为二进制

2. concat(string, string, ...)
将多个字符串拼接成一个字符串

3. right(string, number)
从右边截取字符串string,截取number个字符

4. SUBSTRING(string, startIndex, number)
截取字符串string,从第startIndex个字符开始截取,截取number个字符