SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 02.04.2008 23:35:21

SoGe
Участник
Зарегистрирован: 02.04.2008
Сообщений: 4

Помогите написать запрос и хранимую процедуру

Есть таблица в которой несколько полей: f1, f2 - тип INT, f3 - тип TEXT. В поле f3 хранятся строки типа "param1=N;param2=M;", где N и M целые числа.
Необходимо сделать выборку по условию (например): f1=2, f2=3,  10 <= param1 из поля f3 <= 20

Помогите составить запрос, насколько я понимаю без создания хранимой процедуры тут не обойтись.

Заранее большое спасибо

Неактивен

 

#2 03.04.2008 00:03:21

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Помогите написать запрос и хранимую процедуру

Хранимая процедура будет просто перебирать все строки для заданных 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

Неактивен

 

#3 03.04.2008 00:36:11

SoGe
Участник
Зарегистрирован: 02.04.2008
Сообщений: 4

Re: Помогите написать запрос и хранимую процедуру

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)

Неактивен

 

#4 03.04.2008 01:00:06

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Помогите написать запрос и хранимую процедуру

Неограниченное количество параметров совершенно не мешает провести нормализацию данных в том, виде, который я описал

Неактивен

 

#5 03.04.2008 01:02:03

SoGe
Участник
Зарегистрирован: 02.04.2008
Сообщений: 4

Re: Помогите написать запрос и хранимую процедуру

rgbeast написал:

Неограниченное количество параметров совершенно не мешает провести нормализацию данных в том, виде, который я описал

А если все же без нормализации smile
Подскажите как должна выглядеть хранимая процедура

Неактивен

 

#6 10.04.2008 04:04:25

LazY
_cмельчак
MySQL Authorized Developer and DBA
Зарегистрирован: 02.04.2007
Сообщений: 849

Re: Помогите написать запрос и хранимую процедуру

Не совсем понял, что нужно от третьего поля. Что значит

10 <= param1 из поля f3 <= 20

?

Неактивен

 

#7 10.04.2008 11:06:18

SoGe
Участник
Зарегистрирован: 02.04.2008
Сообщений: 4

Re: Помогите написать запрос и хранимую процедуру

LazY написал:

Не совсем понял, что нужно от третьего поля. Что значит

10 <= param1 из поля f3 <= 20

?

В поле f3 хранятся строки типа "param1=N;param2=M;", например там может быть такая строка: "param1=15;param2=17;"
мне нужно выбрать строки в которых 10<=param1<=20 (числа 10 и 20 приведены в качестве примера, там могут быть любые числа)

Неактивен

 

#8 11.04.2008 13:18:08

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Помогите написать запрос и хранимую процедуру

Думаю, надо бегать курсором, распарсивать каждую строку и дальше уже обрабатывать.
Но это будет тормозить неимоверно smile

Неактивен

 

#9 16.04.2008 03:28:04

LazY
_cмельчак
MySQL Authorized Developer and DBA
Зарегистрирован: 02.04.2007
Сообщений: 849

Re: Помогите написать запрос и хранимую процедуру

Вы знаете, я пришел к выводу, что в вашем случае с проблемой только средствами 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;

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson