Как сделать запрос с регуляркой в mysql?

dandandan

Мой дом здесь!
Регистрация
7 Авг 2008
Сообщения
1.036
Реакции
292
Есть таблица zakaz столбец nomerzakaza - varchar(10)
Формат содержимого столбца ПорядковыйНомерЗаказа затем дефис затем Год Например:
54654-2009
1001-2010
154-2011
2-2011
15-2011

Требуется с помощью запроса к БД (видимо с использованием REGEXP) выдернуть наибольшее значение ПорядоковогоНомераЗаказа для текущего года.

Из приведенного примера выше нужно выдернуть строку 154-2011 получив значение 154
 
регулярки на мускуле не возвращают строку, они только возвращают маркер подпадает строка под шаблон или нет, не более. Я бы копал в сторону строковых ф-ций, чтобы как-нить разделить надвое значене "номер-год", а потом уже выборку делал, или же писал процедуру которая бы проходилась по строкам и искала нужное значение
 
это ОЧЕНЬ плохая идея вам пришла в голову.
так делать нельзя практически НИКОГДА

практически любая регулярка и строковая функция, впрочем как и маска требуют времени пропорционально количеству записей в таблице
то есть надо проверить каждую строку таблицы.
когда таблица вырастет в 10 раз, запрос замедлится в 10 раз.
когда таблица вырастет в 1000 раз, то и запрос соответственно замедлится в 1000 раз.

в вашем случае стоит разделить данной поле на два цифровых поля, добавить индекс, и делать выборку, опираясь уже на индекс
для данного случая, это будет правильным решением
 
если они все в таком формате, типа [цифры-цифры]
Код:
SELECT ids, MAX(SUBSTR(nomerzakaza,1,LOCATE('-',nomerzakaza)-1))
FROM ( SELECT ids, nomerzakaza, nomerzakaza REGEXP concat("[[:alnum:]]\-", YEAR(CURRENT_DATE()), '$') as nums )
где-то так, нужно только поправить `ids` на нужное имя поля. Но лучше было бы делать не вслепую, а на конкретном дампе базы :)

UPD:
упростил, будет выполняться быстрее регекспа, но к сожалению индексации конец строки кажись не подлежит
Код:
SELECT ids, MAX(SUBSTR(nomerzakaza,1,LOCATE('-',nomerzakaza)-1)) as maximum FROM zakaz
WHERE SUBSTR(nomerzakaza, LOCATE('-', nomerzakaza)+1, 4) = YEAR(CURRENT_DATE())
 
Основная задача была - начинать каждый год новую нумерацию заказов.

но к сожалению индексации конец строки кажись не подлежит
В смысле индекс для ускорения выборки нельзя будет сделать или что-то другое имелось ввиду?
 
Да, имел ввиду именно индексацию подстроки для ускорения выполнения запроса.
что нету индексов функций в мускле, поэтому лучше разделить этот "код" на две части: 4 символа справа и все, что до тире:
Код:
UPDATE zakaz SET `sleva`=SUBSTR(nomerzakaza, 1, LOCATE('-', nomerzakaza)-1), `sprava`=RIGHT(nomerzakaza,4);
И в дальнейшем создавать эти значения отдельно либо апдейтить их раз в году и не забыть проиндексить оба доп. поля :)
Ну а там уже
Код:
SELECT id, max(sleva) FROM zakaz WHERE sprava='2011'
 
Назад
Сверху