|
|
|
WHERE по битовой маске
|
|||
|---|---|---|---|
|
#18+
Народ, всем привет! у меня следующий вопрос. Бьюсь уже продолжительное время, надеюсь на Вашу помощь. Есть две следующие таблички, приведу код их формирования: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. в этих таблицах поля group, subgroup - это текст (название групп и подгрупп), а filter - это некая последовательность 0b00101010100010000 и т.д. Мне нужно получить все записи из таблицы subgroups, которые удовлетворяют значению битовой маски какой-то записи в таблице group. Как это сделать, помогите плиззз.... PS.: база писалась не мною, я лишь пытаюсь изменить клиентскую часть проги. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2013, 16:00:09 |
|
||
|
WHERE по битовой маске
|
|||
|---|---|---|---|
|
#18+
where groups.filter = subgroups.filter ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2013, 16:26:56 |
|
||
|
WHERE по битовой маске
|
|||
|---|---|---|---|
|
#18+
ScareCrowwhere groups.filter = subgroups.filter ? не. в groups поле filter принимает какое-то значение. например, возьмем 0b11100000000 а в subgroups мне нужно выбрать все подгруппы, которые удовлетворяют этой битовой маске. гугл говорит что надо делать что то типа такого: select * from subgroups where filter & '0b11100000000' но так не получается. возвращается 0 строк... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2013, 16:33:43 |
|
||
|
WHERE по битовой маске
|
|||
|---|---|---|---|
|
#18+
aleksey_sqlScareCrowwhere groups.filter = subgroups.filter ? не. в groups поле filter принимает какое-то значение. например, возьмем 0b11100000000 а в subgroups мне нужно выбрать все подгруппы, которые удовлетворяют этой битовой маске. гугл говорит что надо делать что то типа такого: select * from subgroups where filter & '0b11100000000' но так не получается. возвращается 0 строк... select * from subgroups where filter & b'011100000000' = b'011100000000' ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2013, 16:46:07 |
|
||
|
WHERE по битовой маске
|
|||
|---|---|---|---|
|
#18+
Напрямую - никак. Можно попробовать выцеплять нужные символы, затем уже в них проверять нужные биты. http://dev.mysql.com/doc/refman/5.5/en/bit-functions.html MySQL uses BIGINT (64-bit) arithmetic for bit operations, so these operators have a maximum range of 64 bits. При этом еще нужно с кодировками не налажать, ибо хранить бинарные данные в utf8 несколько, имхо, странно. И, кстати, понятие "удовлетворяют этой битовой маске" нужно расшифровать. Или это точное равенство, или установленные биты, или снятые биты, или еще что-то... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2013, 16:46:13 |
|
||
|
WHERE по битовой маске
|
|||
|---|---|---|---|
|
#18+
miksoftНапрямую - никак. Можно попробовать выцеплять нужные символы, затем уже в них проверять нужные биты. http://dev.mysql.com/doc/refman/5.5/en/bit-functions.html MySQL uses BIGINT (64-bit) arithmetic for bit operations, so these operators have a maximum range of 64 bits. При этом еще нужно с кодировками не налажать, ибо хранить бинарные данные в utf8 несколько, имхо, странно. И, кстати, понятие "удовлетворяют этой битовой маске" нужно расшифровать. Или это точное равенство, или установленные биты, или снятые биты, или еще что-то... печально что напрямую никак. а я уж думал и в сторону substr при представлении бинарного поля как строку (varchar) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2013, 20:06:37 |
|
||
|
WHERE по битовой маске
|
|||
|---|---|---|---|
|
#18+
aleksey_sqlа я уж думал и в сторону substr при представлении бинарного поля как строку (varchar)Ну как-то так можно попробовать, но учтите, что substr работает с символами, а не байтами. А в utf8 символ имеет переменную длину в байтах. Нельзя ли сменить структуру таблицы? Что покажут следующие запросы: Код: sql 1. Код: sql 1. ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2013, 20:13:10 |
|
||
|
WHERE по битовой маске
|
|||
|---|---|---|---|
|
#18+
Ну офигеть теперь. что значит напрямую нельзя ? Для того чтобы найти такие записи, нужно просто написать запрос находящий эти записи! Операции с битовыми масками в mysql обрабатываются точно так же как и в других языках программирования. Есть OR, AND. У vbulletin подобная структура для представления логических свойств разных сущностней и никто не помер. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2013, 21:21:36 |
|
||
|
WHERE по битовой маске
|
|||
|---|---|---|---|
|
#18+
netwindОперации с битовыми масками в mysql обрабатываются точно так же как и в других языках программирования. Есть OR, AND.Только не для varchar(1024) с CHARSET=utf8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2013, 21:23:32 |
|
||
|
WHERE по битовой маске
|
|||
|---|---|---|---|
|
#18+
а, понятно ну сконвертировать на лету дело-то несложное : select conv(replace('0b010101','0b',0),2,10) & conv('00100',2,10); первая строка - то самое поле. вторая - маска для битового AND. в этом примере результат не равен 0 только когда третий бит установлен ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2013, 21:51:25 |
|
||
|
WHERE по битовой маске
|
|||
|---|---|---|---|
|
#18+
aleksey_sql а filter - это некая последовательность 0b00101010100010000 и т.д. вот это примером проиллюстрируйте типа select * from groups. непонятно, там действительно двоичная запись ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2013, 21:53:32 |
|
||
|
WHERE по битовой маске
|
|||
|---|---|---|---|
|
#18+
aleksey_sql, 1. VARCHAR(1024) UTF-8 - это конечно круто для битовых масок. Сразу: какова реальная максимальная длина битовой строки фильтра? То есть, что показывает запрос вида SELECT MAX(CHAR_LENGTH(filter)-2) FROM `groups`; для этого поля? Это ключевой вопрос по возможности "конвертировать" такую строку во что-то "удобо варимое". 2. Если длина меньше или равна 64 полезных бит, то как советовал netwind - конвертируете в длинное целое и работаете обычными побитовыми операциями. Можно сделать копии этих колонок в виде длинного целого, дабы не конвертить на лету в запросах. 3. А вот ежели - нет, но их не шибко много - можно попробовать разбить по 64 бита строковыми функциями и разогнать по нескольким полям. 4. А вот ежели там все 1024 бита... примите мои поздравления. Разгонять в 64 поля и клеить их потом в запросе... думаю обработка строковыми функциями будет живее даже. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2013, 06:51:38 |
|
||
|
WHERE по битовой маске
|
|||
|---|---|---|---|
|
#18+
Arhat109, Кстати, вы писали, что "разработка не ваша, так было"... а "спросить" - не у кого (где аффтар?), посмотреть КАК оно работало раньше - никак (код снесли)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2013, 06:53:53 |
|
||
|
WHERE по битовой маске
|
|||
|---|---|---|---|
|
#18+
никакая это не битовая маска хосподи. Это код выбора каких-то опций. 1 - вкл, 0 - выкл, или наоборот, а что каждый вкл/выкл значит - знает только приложение. Ну вот, поскольку это обычные строки их можно сравнить. Если же хочется вычитать или складывать и использовать результат для условия выборки, то наверно придется сперва конвертировать. Код: sql 1. res --- 100 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2013, 09:40:32 |
|
||
|
WHERE по битовой маске
|
|||
|---|---|---|---|
|
#18+
aleksey_sql например, возьмем 0b11100000000 а в subgroups мне нужно выбрать все подгруппы, которые удовлетворяют этой битовой маске. В вашем случае возьмем "11100000000" судя по варчарам. Это значит вы получите 11100000000 для всех значений полей в которых записано последние три бита установлены в 1. Например 11100000000 & 11100000011 = 11100000000, 11100000000 & 11111111111 = 11100000000 и так далее. Или 11100000000 & 10100000000 != 11100000000. Вы этого хотите? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2013, 09:48:11 |
|
||
|
WHERE по битовой маске
|
|||
|---|---|---|---|
|
#18+
deblogger, да понятно, что "сейчас" - это просто строка, также понятно что это какое-то множество переключателей... и вполне возможно - битовое представление наличия того или иного параметра у группы, например "товаров". Если надо найти такие же строки фильтра в другой таблице - то тупо сравниваем оба текста промеж себя... и пофиг как и что в них закодировано. А вот если надо найти заданный набор переключателей в другой табличке - то их надо вычленять на лету... как? сильно зависит от предельной длины этих строк. К сожалению, автор похоже или решил задачку или забил на неё... (а мы тут внезапно теоретизируем) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2013, 10:12:33 |
|
||
|
WHERE по битовой маске
|
|||
|---|---|---|---|
|
#18+
debloggeraleksey_sql например, возьмем 0b11100000000 а в subgroups мне нужно выбрать все подгруппы, которые удовлетворяют этой битовой маске. В вашем случае возьмем "11100000000" судя по варчарам. Это значит вы получите 11100000000 для всех значений полей в которых записано последние три бита установлены в 1. Например 11100000000 & 11100000011 = 11100000000, 11100000000 & 11111111111 = 11100000000 и так далее. Или 11100000000 & 10100000000 != 11100000000. Вы этого хотите? Честно говоря, это база данных приложения, которое писал НЕ я. Я лишь пытаюсь понять, что происходит в этой БД (какие связи), и каким макаром фильтровать по этому полю. Моя задача - написать web-морду для этой базы. Всё складывалось нормально, пока не дошло до этого поля filter. Приведу более полный пример: Первая таблица: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. Вторая таблица: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Так вот эти две табличка связаны по catcode и filter. По catcode всё просто... а вот как связать по этому filter - хз... :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2013, 10:14:21 |
|
||
|
WHERE по битовой маске
|
|||
|---|---|---|---|
|
#18+
aleksey_sql, Н-да, как всё запущено... поля-то даже и не одинаковые вовсе... первое 1024, а второе 1920... А Вы не смотрели КАК используется эта БД в том приложении, где она работает? Подозреваю, что "связаны" они весьма примитивно частью подстроки... причем фиксированной частью (начало, конец или как ещё). Это многое может упростить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2013, 10:18:43 |
|
||
|
WHERE по битовой маске
|
|||
|---|---|---|---|
|
#18+
aleksey_sql, и, кстати, в табличке series - поле всегда 32 бита? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2013, 10:20:21 |
|
||
|
WHERE по битовой маске
|
|||
|---|---|---|---|
|
#18+
Один программист сделал себе переменную типа db, второй пытается ее освоить. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2013, 10:22:02 |
|
||
|
WHERE по битовой маске
|
|||
|---|---|---|---|
|
#18+
Arhat109aleksey_sql, Н-да, как всё запущено... поля-то даже и не одинаковые вовсе... первое 1024, а второе 1920... А Вы не смотрели КАК используется эта БД в том приложении, где она работает? Подозреваю, что "связаны" они весьма примитивно частью подстроки... причем фиксированной частью (начало, конец или как ещё). Это многое может упростить. как оно используется в приложении я могу понять ТОЛЬКО из выбирающихся данных. данные выбираются разные (поле filter у них разное и substr count не всегда = 1... поэтому собсно я и смотрел в сторону битовой маски). Протрассировать запросы flextracer'ом также не удалось. Вышибает трейсер на этапе запросов связанных с этими табличками с полем filter :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2013, 10:23:43 |
|
||
|
WHERE по битовой маске
|
|||
|---|---|---|---|
|
#18+
Arhat109aleksey_sql, и, кстати, в табличке series - поле всегда 32 бита? нет. поле filter там тоже переменное :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2013, 10:25:43 |
|
||
|
WHERE по битовой маске
|
|||
|---|---|---|---|
|
#18+
aleksey_sql[ Протрассировать запросы flextracer'ом также не удалось. Вышибает трейсер на этапе запросов связанных с этими табличками с полем filter :) это что еще за фуфел? в mysql для этого есть general log. его не может вышибить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2013, 11:09:08 |
|
||
|
WHERE по битовой маске
|
|||
|---|---|---|---|
|
#18+
netwindaleksey_sql[ Протрассировать запросы flextracer'ом также не удалось. Вышибает трейсер на этапе запросов связанных с этими табличками с полем filter :) это что еще за фуфел? в mysql для этого есть general log. его не может вышибить. это не фуфел. это прога которая трассирует запросы с другой субд. дело в том, что я юзаю mysql уже смигрированную с другой субд. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2013, 11:12:37 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=38349784&tid=1836211]: |
0ms |
get settings: |
8ms |
get forum list: |
20ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
34ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
63ms |
get tp. blocked users: |
1ms |
| others: | 209ms |
| total: | 351ms |

| 0 / 0 |
