Поиск по полую типа array

akxxiv

Новичок
Очень понимаю что в Мускуле нет такого типа поля, но тем не менее...

Задача:

Есть накладная на товар, который может перевозится в нескольких температурных режимах:
0 => -18С
1 => +2 +4С
2 => +5 +10С
3 => +11 +25С

При чем на выбор она может перевозиться в нескольких режимах одновременно.
Как это запрограммировать, чтобы было удобно при поиске.

Вижу аж несколько вариантов:

1. Ввести поле tmpr (varchar) типа .0.1. или .1.2.3. и поиск по ним типа LIKE("%.1.%") OR LIKE("%.2.%") Меня смущает LIKE
2. Создать доп. таблицу: wb_id | tmpr и поиск:
2.1. два запроса $ids = SELECT * ... WHERE tmpr IN(1,2) ; $wbs = SELECT * ... WHERE id IN($ids) проблема в том, что про больших объемах этих швы может быть до хрена...
2.1. SELECT * ... (SELECT COUNT(*) ... WHERE wb_id IN(?)) as tmpr ... HAVING tmpr>0 Смущает HAVING
3. Возможно как-то складывать температурные режимы, чтобы суммы были всегда уникальным. Типа как права в юниксе. Но че-то я щас пока не могу уловить алгоритма (с матчастю не очень)

Может еще какие варианты есть?

По п.3. может кто разъяснит как правильно сделать уникальными суммы, а так же преобразовать сумму в обратную сторону, т.е. разбить ее на слагаемые?
 

флоппик

promotor fidei
Команда форума
Партнер клуба
1. поскольку это диапазоны, делаешь табличку-справочник с температурными режимами, и два поля — «от» и «до» в накладной.
Так, если от = 1, и до = 3, то это температурный режим +2 .. +25
 

akxxiv

Новичок
Не покатит. От и до там могут быть тока названия. Они могут пересекаться. А могут быть вообще None Food которые могут перевозиться в любом режиме кроме заморозки
 

флоппик

promotor fidei
Команда форума
Партнер клуба
Да ради бога, путь пересекаются — проблема в чем?
 

Vin-Diesel

Новичок
поле SET чем не нравится?

а по третьему пункту складывай степени двойки.
например, есть 4 типа:
только первый тип = 2^(1-1) = 1
только второй тип = 2^(2-1) = 2
третий и первый типы = 2^(3-1) + 2^(1-1) = 4 + 1 = 5
четвертый, третий и первый типы = 2^(4-1) + 2^(3-1) + 2^(1-1) = 8 + 4 + 1 = 13
После можно перегонять в двоичную маску, будет вроде того (соответственно примерам выше):
0001
0010
0101
1101
 

akxxiv

Новичок
Прикольно. А как потом например 13 обратно разбить на 8 + 4 + 1 ?
 
Сверху