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

Тема в разделе "Базы данных", создана пользователем dandandan, 5 янв 2011.

Модераторы: latteo
  1. dandandan

    dandandan

    Регистр.:
    7 авг 2008
    Сообщения:
    975
    Симпатии:
    255
    Есть таблица zakaz столбец nomerzakaza - varchar(10)
    Формат содержимого столбца ПорядковыйНомерЗаказа затем дефис затем Год Например:
    Требуется с помощью запроса к БД (видимо с использованием REGEXP) выдернуть наибольшее значение ПорядоковогоНомераЗаказа для текущего года.

    Из приведенного примера выше нужно выдернуть строку 154-2011 получив значение 154
     
  2. FaLL3N

    FaLL3N Постоялец

    Регистр.:
    4 дек 2006
    Сообщения:
    100
    Симпатии:
    17
    регулярки на мускуле не возвращают строку, они только возвращают маркер подпадает строка под шаблон или нет, не более. Я бы копал в сторону строковых ф-ций, чтобы как-нить разделить надвое значене "номер-год", а потом уже выборку делал, или же писал процедуру которая бы проходилась по строкам и искала нужное значение
     
  3. Alternator

    Alternator

    Регистр.:
    23 мар 2009
    Сообщения:
    295
    Симпатии:
    145
    это ОЧЕНЬ плохая идея вам пришла в голову.
    так делать нельзя практически НИКОГДА

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

    в вашем случае стоит разделить данной поле на два цифровых поля, добавить индекс, и делать выборку, опираясь уже на индекс
    для данного случая, это будет правильным решением
     
  4. failometr

    failometr Постоялец

    Регистр.:
    30 апр 2009
    Сообщения:
    128
    Симпатии:
    45
    если они все в таком формате, типа [цифры-цифры]
    Код:
    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())
    
     
    dandandan нравится это.
  5. dandandan

    dandandan

    Регистр.:
    7 авг 2008
    Сообщения:
    975
    Симпатии:
    255
    Основная задача была - начинать каждый год новую нумерацию заказов.

    В смысле индекс для ускорения выборки нельзя будет сделать или что-то другое имелось ввиду?
     
  6. failometr

    failometr Постоялец

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