bit_or а-ля SUM

berkut

Новичок
bit_or а-ля SUM

что-то затупил, можно-ли как-то посчитать bit_or() для всех полей в группе??
типо
Код:
SELECT SUM(fieldOfTypeSET) FROM tbl GROUP BY field
вот эта штука посчитает сумму всех значений в группе, а мне нужно побитовое или для всех полей группы :confused:
 

berkut

Новичок
аммм... ну допустим есть таблица tbl(field INT, setField INT)
с данными
Код:
field | setField
1     | 2
1     | 2
1     | 8
2     | 0
вот мне нужно получить такой резалт:
1 | 10 - т.е. echo( 2 | 2 | 8 );
2 | 0
тобишь агрегатную функцию по типу SUM() но которая не складывает значения, а делает с ними BIT_OR()
 

Gas

может по одной?
Dl
+1
действительно

-~{}~ 04.12.08 19:00:

Ну а до того как я увидел эту ф-цию в мануале, у меня уже почти был готов это "вротмненоги" запрос :)

Код:
SET @i=0, @field_tmp=null, @bit_or=null;
SELECT *, SUBSTRING( MAX( CONCAT(LPAD(i,10,'0'), bit_or) ), 11) AS bit_or 
FROM 
(
  SELECT *, @i:=@i+1 as i, 
         (IF(field=@field_tmp, @bit_or:=(@bit_or|fieldOfTypeSET), IF(@field_tmp:=field, @bit_or:=fieldOfTypeSET, 0))) AS bit_or
  FROM test 
  ORDER BY field DESC
) AS t
GROUP BY field
-~{}~ 04.12.08 19:58:

хотя, так как OR операция, а не AND или XOR, то "SUBSTRING( MAX( CONCAT(LPAD(i,10,'0'), bit_or) ), 11)" можно заменить просто на MAX(bit_or), тогда и переменая @i не нужна.
 

berkut

Новичок
Gas да я не про него, а про себя(

-~{}~ 05.12.08 00:27:

хотя при комменте я его пониманию, а вот изначальный - прям теряюсь.... можно на пальцах объяснить, как и что там фунициклирует, если время позволяет
 

Dl

Новичок
Только IF(@field_tmp:=field, ...) будет работать неправильно при field=0, можно заменить на !ISNULL(@field_tmp:=field)
 
Сверху