|
|
|
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 |
|
||
|
WHERE по битовой маске
|
|||
|---|---|---|---|
|
#18+
aleksey_sql, я шучу. попробуйте включить general-log - это часть функционала mysql, который славится стабильностью. он не вылетит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2013, 11:58:45 |
|
||
|
WHERE по битовой маске
|
|||
|---|---|---|---|
|
#18+
aleksey_sqlя юзаю mysql уже смигрированную с другой субд.А вы уверены, что в оригинальной БД эти поля тоже в кодировке utf-8? И еще как бы не оказалось, что приложение пришет/читает в свою БД в однобайтовой кодировке, которую клиент БД преобразует в utf-8. Тогда бинарное содержимое вообще может не соответствовать тому, что видит пользователь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2013, 12:33:41 |
|
||
|
WHERE по битовой маске
|
|||
|---|---|---|---|
|
#18+
netwindaleksey_sql, я шучу. попробуйте включить general-log - это часть функционала mysql, который славится стабильностью. он не вылетит. там СУБД не mysql. другая. щас мы тока про mysql говорим. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2013, 12:51:30 |
|
||
|
WHERE по битовой маске
|
|||
|---|---|---|---|
|
#18+
miksoft, да. там тоже utf8 и такие же значения и типы полей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2013, 12:53:17 |
|
||
|
WHERE по битовой маске
|
|||
|---|---|---|---|
|
#18+
Цифры в любых кодировках одинаковые. Потому что как его там ISO8859-1 несмотря что они арабские. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2013, 13:12:09 |
|
||
|
WHERE по битовой маске
|
|||
|---|---|---|---|
|
#18+
авторЦифры в любых кодировках одинаковые. UTF-32 смотрит на вас как то неодобрительно и немного грустно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2013, 13:28:05 |
|
||
|
WHERE по битовой маске
|
|||
|---|---|---|---|
|
#18+
debloggerЦифры в любых кодировках одинаковые.А причем тут цифры? в символьном представлении там могут быть любые символы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2013, 13:55:12 |
|
||
|
WHERE по битовой маске
|
|||
|---|---|---|---|
|
#18+
aleksey_sqlкак оно используется в приложении я могу понять ТОЛЬКО из выбирающихся данных. данные выбираются разные (поле filter у них разное и substr count не всегда = 1... поэтому собсно я и смотрел в сторону битовой маски). Протрассировать запросы flextracer'ом также не удалось. Вышибает трейсер на этапе запросов связанных с этими табличками с полем filter :) ?!? ни понял... приложение, работающее с этим чудом - компилированно и исходник утерян? Или база мигрирована (стырена) и нифига теперь непонятно? Я в смысле, нафига чего-то как-то "трассировать", когда можно заглянуть в исходник и найти нормальный запрос, который работает с этими полями и понять КАК они связаны и что там на самом деле может быть (а чего НЕ может)... ... у меня ваще пока что, такое осчущение, что в это поле складывается конкатенация обыкновенных переменных, в смысле в 8/16/32/64 бита... за каким-то лешим. Если ЭТО не так, и каждая чиселка строкового представления - соответствует нормальному биту (0/1), то весь набор строковых функций - Вам в помощь. Только я по-прежнему НЕ представляю КАК поле длинной 1024бита может связываться с полем длинной 1920бит... "Что-то не так в датском королевстве". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2013, 17:18:14 |
|
||
|
WHERE по битовой маске
|
|||
|---|---|---|---|
|
#18+
Arhat109Только я по-прежнему НЕ представляю КАК поле длинной 1024бита может связываться с полем длинной 1920бит...Могу предположить, что связь осуществляется только по части этих битов. Кстати, непонятно, почему в комменте указано 1920 битов , а в объявлении типа поля указано 1922 символа в многобайтовой кодировке (т.е. реально туда может вместиться порядка 32000 бит). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2013, 17:24:38 |
|
||
|
WHERE по битовой маске
|
|||
|---|---|---|---|
|
#18+
ScareCrowавторЦифры в любых кодировках одинаковые. UTF-32 смотрит на вас как то неодобрительно и немного грустно Вы про zerofill или что 1 в usc-4 не 31? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2013, 17:28:52 |
|
||
|
WHERE по битовой маске
|
|||
|---|---|---|---|
|
#18+
miksoft, так о том и речь! По какой "части"? Ответ: смотреть исходник или должно быть известно априори (об чём автор - молчит). Есть другой ответ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2013, 17:48:43 |
|
||
|
WHERE по битовой маске
|
|||
|---|---|---|---|
|
#18+
Arhat109, просто, если оно "сначалу" - отрезаешь лишнее с конца... а ежели с конца - то начало режешь и тупо сравниваешь. НО! Как показано - 1024 и 1920 - наибольшая длина... в примерах значительно меньше и утверждается - разная... и? вывод напрашивается: смотреть исходник. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2013, 17:51:13 |
|
||
|
WHERE по битовой маске
|
|||
|---|---|---|---|
|
#18+
Arhat109Arhat109, просто, если оно "сначалу" - отрезаешь лишнее с конца... а ежели с конца - то начало режешь и тупо сравниваешь. НО! Как показано - 1024 и 1920 - наибольшая длина... в примерах значительно меньше и утверждается - разная... и? вывод напрашивается: смотреть исходник. Ну блин разоблачил))) Да, это не моя база, а стыренная. Это каталог автозапчастей Suzuki. Вот пытаюсь найти концы с этим полем filter.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2013, 20:55:40 |
|
||
|
WHERE по битовой маске
|
|||
|---|---|---|---|
|
#18+
aleksey_sqlЭто каталог автозапчастей Suzuki.В TECDOC-е есть аналогичные поля. Почитайте про них в интернетах, возможно, функционал окажется схожим. Насколько я смутно припоминаю, там закодирован то ли рынок сбыта, то ли что-то типа того. Короче, в конечной базе для конкретной местности они могут быть и не нужны вовсе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2013, 22:35:25 |
|
||
|
WHERE по битовой маске
|
|||
|---|---|---|---|
|
#18+
miksoftaleksey_sqlЭто каталог автозапчастей Suzuki.В TECDOC-е есть аналогичные поля. Почитайте про них в интернетах, возможно, функционал окажется схожим. Насколько я смутно припоминаю, там закодирован то ли рынок сбыта, то ли что-то типа того. Короче, в конечной базе для конкретной местности они могут быть и не нужны вовсе. В текдоке фильтр по таким полям делается ф-цией SUBRANGE(поле CAST номер_региона) = 1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2013, 23:28:32 |
|
||
|
WHERE по битовой маске
|
|||
|---|---|---|---|
|
#18+
aleksey_sql, А не надо шифроваться. Вы бы сразу описали задачу "как есть" - не было бы 2-х страничного гадания на кофейной гуще. Ладно вам своё время не жалко... но вам отвечают люди - далеко не безработные, ваще-то. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2013, 06:05:57 |
|
||
|
WHERE по битовой маске
|
|||
|---|---|---|---|
|
#18+
Arhat109aleksey_sql, А не надо шифроваться. Вы бы сразу описали задачу "как есть" - не было бы 2-х страничного гадания на кофейной гуще. Ладно вам своё время не жалко... но вам отвечают люди - далеко не безработные, ваще-то. А зачем же Вы гадаете на кофейной гуще? Я написал задачу как есть. Откуда взята БД и для каких целей это уже другой вопрос. Труд людей я уважаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2013, 08:50:14 |
|
||
|
WHERE по битовой маске
|
|||
|---|---|---|---|
|
#18+
Вот описал свое решение хранение и работа с битовой маской в MySQL ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2013, 18:39:04 |
|
||
|
WHERE по битовой маске
|
|||
|---|---|---|---|
|
#18+
УПС, еще раз Вот описал свое решение хранение и работа с битовой маской в MySQL http://www.sql.ru/forum/989344/hranenie-bitovoy-maski-v-mysql ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2013, 18:39:46 |
|
||
|
|

start [/forum/topic.php?all=1&fid=47&tid=1836211]: |
0ms |
get settings: |
7ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
38ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
49ms |
get tp. blocked users: |
1ms |
| others: | 198ms |
| total: | 321ms |

| 0 / 0 |
