计算mysql中的重叠按位列

时间:2011-04-05 10:58:18

标签: mysql group-by distinct bit-manipulation

我有一个表,其中有一个按位列,表示可以附加到条目的状态列表。每个条目都可以选择多个状态(因此使用按位逻辑)。

我想做的是提取一个查询,告诉我每个状态有多少个(即每个位打开多少次)。我遇到的困难是当然有重叠,所以GROUP BY或DISTINCT不会削减它(据我所见)。

作为一个例子,让我们只有两个值,1和2.以及以下数据

Id | Status
1 | 1
2 | 1
3 | 2
4 | 3

现在,我想计算每一位有多少条目,所以我想要将这3个值计入1和2总计的东西,输出如下:

Bit | Count
1 | 3
2 | 2

我到目前为止最接近的似乎是提取不同的值,然后使用PHP将具有多个条目的值添加到相应的计数中。显然,我想做一些更优雅的事情。

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

根据需要扩展位表

select `bit`, count(*) `count`
from bitt s
inner join (select 1 `bit` union all
            select 2 union all
            select 3 union all
            select 4 union all
            select 5) bits on s.status & Pow(2,bits.`bit`-1)
group by bits.`bit`

答案 1 :(得分:0)

你可以这样做:

SUM(IF(`Status`&1,1,0)) as `count1`,
SUM(IF(`Status`&2,1,0)) as `count2`,
SUM(IF(`Status`&4,1,0)) as `count4`

如果你想优化它,你仍然可以GROUP BY Status,但是你需要(一点点)后期处理来对3位情况下的8行求和。

答案 2 :(得分:0)

另一个变种 -

SELECT 0, COUNT(IF(status >> 0 & 1 = 1, 1, NULL)) FROM table1
UNION
SELECT 1, COUNT(IF(status >> 1 & 1 = 1, 1, NULL)) FROM table1
UNION
SELECT 2, COUNT(IF(status >> 2 & 1 = 1, 1, NULL)) FROM table1
...