Задавайте вопросы, мы ответим
Вы не зашли.
Есть таблица в которой несколько полей: f1, f2 - тип INT, f3 - тип TEXT. В поле f3 хранятся строки типа "param1=N;param2=M;", где N и M целые числа.
Необходимо сделать выборку по условию (например): f1=2, f2=3, 10 <= param1 из поля f3 <= 20
Помогите составить запрос, насколько я понимаю без создания хранимой процедуры тут не обойтись.
Заранее большое спасибо
Неактивен
Хранимая процедура будет просто перебирать все строки для заданных f1, f2 и разбивать f3 на кусочки, что достаточно громоздко. Лучше всего Вам один раз нормализовать таблицу, создав отдельную таблицу params с тремя колонками - id (из первой таблицы), имя параметра, значение параметра.
Можно >10 реализовать поиском регулярного выражения f3 like '%param=1_;%' or f3 like '%param=__;%' or f3 like '%param=___;%'
на форуме была тема про сравнение регулярным выражением http://sqlinfo.ru/forum/viewtopic.php?id=436
Неактивен
rgbeast написал:
Хранимая процедура будет просто перебирать все строки для заданных f1, f2 и разбивать f3 на кусочки, что достаточно громоздко. Лучше всего Вам один раз нормализовать таблицу, создав отдельную таблицу params с тремя колонками - id (из первой таблицы), имя параметра, значение параметра.
Можно >10 реализовать поиском регулярного выражения f3 like '%param=1_;%' or f3 like '%param=__;%' or f3 like '%param=___;%'
на форуме была тема про сравнение регулярным выражением http://sqlinfo.ru/forum/viewtopic.php?id=436
дело в том что кол-во params не ограничено и для разных записей в этой таблице их может быть разное количество. И чилса 10 и 20 я привел исключительно для примера, т.е может быть и 1 <= param1 <= 10000000
Отредактированно SoGe (03.04.2008 00:38:07)
Неактивен
Неограниченное количество параметров совершенно не мешает провести нормализацию данных в том, виде, который я описал
Неактивен
rgbeast написал:
Неограниченное количество параметров совершенно не мешает провести нормализацию данных в том, виде, который я описал
А если все же без нормализации
Подскажите как должна выглядеть хранимая процедура
Неактивен
Не совсем понял, что нужно от третьего поля. Что значит
10 <= param1 из поля f3 <= 20
?
Неактивен
LazY написал:
Не совсем понял, что нужно от третьего поля. Что значит
10 <= param1 из поля f3 <= 20
?
В поле f3 хранятся строки типа "param1=N;param2=M;", например там может быть такая строка: "param1=15;param2=17;"
мне нужно выбрать строки в которых 10<=param1<=20 (числа 10 и 20 приведены в качестве примера, там могут быть любые числа)
Неактивен
Думаю, надо бегать курсором, распарсивать каждую строку и дальше уже обрабатывать.
Но это будет тормозить неимоверно
Неактивен
Вы знаете, я пришел к выводу, что в вашем случае с проблемой только средствами MySQL справиться нельзя: поскольку мы имеем дело с переменным количеством символов, тут не обойтись без регулярных выражений, а средства для работы с ними в MySQL весьма скудные - функция REGEXP
(см. http://dev.mysql.com/doc/refman/5.0/en/ … tions.html)
позволяет только установить совпадение с шаблоном как таковое без какой-либо дополнительной информации.
В такой форме я вижу решение задачи в разделении ее на два этапа:
1) Создание специальной таблицы (лучше временной), в которую заносятся все записи, соответствующие условию f1 = 2 и f2 = 3;
2) Перебор всех записей специальной таблицы, извлечение из нее регулярным выражением paramN и исследование их на предмет совпадения c условием 10 <= paramN <=20
Второй шаг придется делать какими-нибудь другими средствами (скрипт на каком-нибудь из языков, например, perl или php).
Если нужно, могу подсказать соотв. регулярное выражение.
Вообще, конечно, не очень подходит ваша таблица для таких запросов, хотя для такой задачи придумать хорошую структуру таблиц непросто.
Альтернативный вариант есть такой: вместо одной таблицы делаете две - в одной храните пары значений f1 и f2, каждой паре присваиваете уникальный идентификатор, в другой - наборы из номеров и значений параметров; связываете по идентификатору. В терминах кода это вот как:
CREATE TABLE t1 (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
f1 INT,
f2 INT,
UNIQUE KEY (f1, f2)
-- уникальный ключ нужен, чтобы записи об одной и той же паре не дублировались
);
CREATE TABLE t2 (
id INT,
N INT,
value INT,
UNIQUE KEY (id, N)
-- здесь уникальный ключ нужен, чтобы для каждой пары f1 и f2 не было бы двух параметров с одинаковыми номерами
);
SELECT *
FROM t1 INNER JOIN t2 USING (id)
WHERE f1 = 2 AND f2 = 3 AND N BETWEEN 10 AND 20;
Неактивен