Задавайте вопросы, мы ответим
Вы не зашли.
Здравствуйте.
Некоторое время вожусь с MySQL, но забуксовал на такой вот проблеме:
Table:
id code
1234 1
367 5
545 2
1234 8
1234 3
367 2
1234 5
367 1
Есть список id, они определяются в другом месте, а в эту вот таблицу для каждого (или не каждого) id записывается код события, которое с этим id произошло. Соответственно для какого-тоid может вообще не быть записей, для другого их может быть несколько, с разными кодами (а могут быть и с одинаковыми). Задача: вытащить только те id, для которых в этой таблице имеется некая комбинация кодов: например, есть запись с code=1 и code=3 (это будет id=1234), или code=1 и code=5 (это будут id=1234 и 367).
Хочется решить задачу в общем виде, для произвольной комбинации кодов (их может быть не два, а больше - скажем, 1,2,5 или 3,7,12,22), а также для случая, когда некий код (коды) есть, а неких другие, наоборот, при этом нету (1,2,8 есть и при том нет 12).
Ничего умного в голову не приходит Пока только жалкие потуги с JOIN (для двух кодов), но все очень некрасиво и громоздко
Может быть, есть какие-то разумные пути? Хотя бы намекните, в какую сторону рыть может, процедуру надо или еще какую фичу - с этими вещами я пока плохо знаком.
Заранее благодарен за любые советы.
Спасибо.
Неактивен
А сколько кодов разных? Как написано 8 или их миллион? Сколько строк в таблице? Сколько id с заданным кодом?
В такой форме таблице ничего более красивого, чем много JOIN-ов сделать не получится. Если есть возможность быстро преобразовать таблицу к другому виду, решение будет более красивым. Если кодов мало - сделать битовое поле. Если много - текстовую строку.
Например
Неактивен
Спасибо! Да, пожалуй, это наиболее плодотворный подход. Более того, в принципе можно в момент добавления новой строки в эту таблицу заранее составлять список для данного id кодов и хранить (id с описанием хранится же в другой таблице, где id - ключевое поле). Наверное.
Неактивен
А еще вопрос: в чем преимущество битовой строки? Кодов не очень много, примерно 20-30. То есть, если я правильно понял, номер кода == позиция в битовой строке. И как это можно использовать?
Спасибо.
Неактивен
Извините, не полностью описал параметры: сейчас id-ов порядка 4-5 тысяч (и более в перспективе, но вряд ли больше 100000), по каждому id от примерно 3-5 до 10-15 (может более, но редко) записей с кодами. Кроме того, в рассматриваемой таблице еще ряд записей, служебных, тоже по несколько (4-8) на каждый id. Реально сейчас записей в таблице примерно в 10 раз больше, чем id-ов (порядка 40 тысяч).
Неактивен
Да, битовое поле — это поле, где каждый бит обозначает свой элемент.
Использовать — очень просто. Придумываете нужную последовательность
(например, 1-2-5), преобразуете в число (биты считают от нуля, поэтому
в нашем примере 2^0 + 2^1 + 2^4 = 19) и делаете выборку
(SELECT FROM tablename WHERE codes = 19).
--
А вот сколько видов кодов Вы не сказали
Неактивен
Спасибо!
Кодов не очень много, примерно 20-30, я как раз таки написал но тогда придется заранее собирать эту битовую строку и хранить. Тогда все понятно и просто. А если ее собирать во время запроса... тогда, вероятно, как-то так?
Неактивен
Да, и правда я не заметил количество значений Чтобы упростить себе работу
с битами, можно подумать о типе SET — может оказаться более простым с точки
зрения преобразований.
Штука со степенями двойки при равенствах будет работать, разумеется, быстрее.
Хотя бы потому, что сможет использовать индекс.
Неактивен