2011-04-05 76 views
1

我有一個表,其中有一個按位列表示可以附加到條目的狀態列表。每個條目可以有多個狀態選擇(因此使用按位邏輯)。在mysql中計算重疊按位列

我想要做的是拉一個查詢,它會告訴我每個狀態有多少個條目(即每個位打開多少次)。我遇到的困難是,當然有重疊,所以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

你可以這樣做:

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,但那麼你就需要(略)後處理,總結了8行,你會得到一個3位情況。

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` 
+0

是啊,這可能是工作。工會有點醜陋,但我懷疑我不得不按照這些路線做些事情。我想知道是否有一種方法可以使用內部連接和BIT_OR()將合適的值存入位表中,但我無法弄清楚如何分解結果。 – dmnc 2011-04-05 11:59:54

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 
...