我有一个表,其中有一个按位列,表示可以附加到条目的状态列表。每个条目都可以选择多个状态(因此使用按位逻辑)。
我想做的是提取一个查询,告诉我每个状态有多少个(即每个位打开多少次)。我遇到的困难是当然有重叠,所以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将具有多个条目的值添加到相应的计数中。显然,我想做一些更优雅的事情。
有什么想法吗?
答案 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
...