Есть таблица, в числе столбцов которой есть значения диапазонов версий. Код (Text): version version_range 2.3.1.800 2.3.1.1025 2.3.1.2000 2.3.1.2500 3.5.1.100 3.5.1.200 И т.д. Мне приходит версия, для которой необходимо выбрать все строки, попадающие в диапазон. Пример - пришла версия 2.3.1.1000 Попадает в первый диапазон. Каким запросом мы можем получить все строки с диапазонами, подходящими под мою версию? Варианты моего решения 1) С ходу лезущий в голову BETWEEN [sql]SELECT * FROM table WHERE '2.3.1.1000' BETWEEN version AND version_range[/sql] Работать естественно не будет, так как при сортировке строк 2.3.1.800 стоит ниже чем 2.3.1.1025 2) Первое, что нагуглил по запросу "натуральная сортировка" - приведение к числовому типу. [sql]SELECT * FROM table WHERE '2.3.1.1000' + 0 BETWEEN version + 0 AND version_range + 0[/sql] Работать также не будет - отбросится полностью "дробная" часть (а именно она и важна) [sql]SELECT '2.3.1.1000' + 0 [/sql] возвращает просто 2 3) Костыльное решение- убрать все точки, и сравнить как числа [sql]SELECT * FROM table WHERE REPLACE('2.3.1.1000', '.', '' )+ 0 BETWEEN REPLACE(version, '.', '' )+ 0 AND REPLACE(version_range, '.', '' )+ 0;[/sql] Работать будет только если во всех версиях одинаковое число знаков Код (Text): 2.3.1.800 => 231800 2.3.1.2000 => 2312000 3.5.1.100 => 351100 Второе и третье числа меняются местами, а этого быть не должно Вытащить в php и сравнить через version_compare - плохой вариант. В таблице несколько десятков тысяч записей. Я в тупике, может кто сталкивался?
SUBSTRING_INDEX мог бы подойти, но мажорные версии тоже нужно учитывать. А за ссылку спасибо, там есть идея приводить всё к строкам типа Код (Text): 2.3.1.800 => 0002.0003.0001.0800 2.3.1.2000 => 0002.0003.0001.2000 3.5.1.100 => 0003.0005.0001.0100 Мне кажется, рациональное зерно тут есть)
Есть ещё один хак, с использованием INET_ATON, но у него есть ограничения и тебе он кажется не подойдёт http://stackoverflow.com/questions/7897 ... ementation
не-а, у него ограничение для каждого разряда - 256 В принципе уже реализовал перевод в 0003.0005.0001.0100 - обернул в хранимую функцию.