Jump to content
  • 0

Разбитие и суммирование строки или регуляркой


Николя223
 Share

Question

Может кто подсказать?

В БД в поле хранятся значения в виде "20/30/60"

при этом нужно сравнить с параметром, указанным в $_GET запросе

Т.е.  нужно чтобы например 120>= 20+30+60   

Можно ли через REGEXP это сделать(суммирование параметров)? 

Или же разбить на три ячейки и сравнивать с нужным значением

 

Т.е.   при использовании SELECT, сделать выборку с нужной подменой

Link to comment
Share on other sites

11 answers to this question

Recommended Posts

  • 0

rus, не то что можно, а необходимо)

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

Link to comment
Share on other sites

  • 0

Я вкурсе. затык в самом движке. выборка - 100-200 позиций

поэтому чисто через mysql нужно

 

  + там пагинация и это поле одно из параметров фильтра


rus, а возможно в mysql разбить одно поле в выборке на три? примерно как explode?

Я искал вчера, нашел только странноватые пользовательские функции

Link to comment
Share on other sites

  • 0

могу предложить следующие варианты:

1. если могут быть только двузначные числа "20/30/60", то SUBSTRING(col, 1, 2) можно достать пары и суммировать их.

2. иначе можно сделать так REGEXP_SUBSTR(col; 'regexp шаблон') делаем 3 шаблона по извлечению чисел сначала строки и до косой черты, между косыми чертами и от косой черты до конца и складываем эти числа

  • Like 1
Link to comment
Share on other sites

  • 0

Регулярки  довольно медленная штука, да и функционала регулярных выражений, которые идут "в коробке" с MySQL не уверен, что будет достаточно. Скорее всего придется плагин цеплять. В данном случае вполне будет достаточно функции SUBSTRING_INDEX:

SELECT  tmp.strFROM  (    SELECT      '20/30/60' AS str    UNION    SELECT      '23/10/10'    UNION    SELECT      '22/70/20'  ) AS tmpWHERE  SUBSTRING_INDEX(tmp.str, '/', 1)    + SUBSTRING_INDEX(SUBSTRING_INDEX(tmp.str, '/', 2), '/', -1)    + SUBSTRING_INDEX(tmp.str, '/', -1) > 100

Использование индекса, при таком построении запроса, исключено.

Edited by CoDy
  • Like 1
Link to comment
Share on other sites

  • 0
rus, а возможно в mysql разбить одно поле в выборке на три? примерно как explode? Я искал вчера, нашел только странноватые пользовательские функции

да, тоже видел эти ф-ции, как вариант попробуй решение от CoDy, есть конечно и другой выход - скачать бд и через notepad++ пройтись поиском и автозаменой на регулярке, но ты ж говоришь там cms вставляет так? значит наверное отпадает...

Link to comment
Share on other sites

  • 0
Использование индекса, при таком построении запроса, исключено.

Как вариант, если производительность запроса сильно упадет. Тогда можно добавить к таблице новую колонку с интом, и дэфолтовым значением 0 и проиндексировать. И повесить триггер на таблицу, который будет  "разбирать" строку, суммировать и результат писать в созданную колонку. Такой подход по идее будет полностью совместим со всеми алгоритмами наполнения и выборки данных из этой таблицы.

 

Такой подход будет уместен, если данные в таблице меняются не сильно часто. И соотношение запись / чтение меньше 1(а лучше если близко к 0).

Edited by CoDy
Link to comment
Share on other sites

  • 0

 

Использование индекса, при таком построении запроса, исключено.

Как вариант, если производительность запроса сильно упадет. Тогда можно добавить к таблице новую колонку с интом, и дэфолтовым значением 0 и проиндексировать. И повесить триггер на таблицу, который будет  "разбирать" строку, суммировать и результат писать в созданную колонку. Такой подход по идее будет полностью совместим со всеми алгоритмами наполнения и выборки данных из этой таблицы.

 

Такой подход будет уместен, если данные в таблице меняются не сильно часто. И соотношение запись / чтение меньше 1(а лучше если близко к 0).

 

там положить на производительность. сервер мощный. а клиенты не такими уж и толпами ходят

главное пока чтобы эта опция фильтра работала.....  потом можно и саму концепцию менять

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy