Подсчет перекрывающихся побитовых столбцов в MySQL - PullRequest
1 голос
/ 05 апреля 2011

У меня есть таблица, в которой есть побитовый столбец, представляющий список состояний, которые можно прикрепить к записи.У каждой записи может быть выбрано несколько статусов (отсюда и использование побитовой логики).

Что я хотел бы сделать - это запрос, который подскажет мне, сколько существует энтри для каждого статуса (т.е. сколькораз каждый бит включен).Трудность, с которой я столкнулся, состоит в том, что, конечно, есть перекрытие, поэтому 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 ]

1 голос
/ 05 апреля 2011

Расширить таблицу битов, как требуется

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 голосов
/ 05 апреля 2011

Еще один вариант -

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
...
0 голосов
/ 05 апреля 2011

Вы можете сделать:

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-битной ситуации.

...