Какой самый простой способ создать функцию MySQL, которая по-разному создает предложение where? - PullRequest
0 голосов
/ 04 января 2019

В программе, над которой я работаю, есть запрос, работающий по иерархической структуре таблиц. У меня есть таблица компаний, у каждой компании есть местоположения (которые имеют свою собственную таблицу), у каждого местоположения есть области, у каждой области есть активы, и у каждого актива есть проекты. Все они (компания, местоположение, область, актив, проект) имеют логическое поле active.

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

В настоящее время это достигается созданием строки запроса с кучей операторов if, а сам запрос имеет большую отдачу, поэтому он может быть медленным, а также делает код уродливым и немного менее простым в обслуживании / изменении. Я хочу ускорить это с помощью функции MySQL.

Прямо сейчас единственное, что я могу подумать, - это конкретизировать каждый сценарий. У кого-то нет никаких фильтров - случай 1. Кто-то хочет фильтровать только по активным / неактивным компаниям - случай 2. Только по местоположению - случай 3 ... только проекты - случай 6. Тогда мне придется иметь дело с каждым случаем о каждой комбинации, и теперь мы говорим о многих случаях.

Я полагаю, что мои знания SQL должны быть ограничены, и, вероятно, есть лучший способ сделать это. Есть идеи?

Я думал о том, что объявление функции MySQL будет выглядеть примерно так:

FUNCTION `getData` (
    companyActive integer, 
    locationActive integer, 
    areaActive integer, 
    assetActive integer, 
    projectActive integer
)

где каждое целое число будет:

  • -1 если у пользователя нет фильтра и возвращаются все вещи этого типа
  • 0 не активен только для этого типа, возвращается
  • 1 - активен только этот тип.

То есть, если companyActive = -1, для него нет условия where, если это 1 или 0, в зависимости от company.active = 1/0.

РЕДАКТИРОВАТЬ: После некоторого тестирования этот запрос НЕ был тем, что замедлял мою программу, так что это было ненужным, ха-ха, однако сегодня я узнал что-то новое, так что, ребята, спасибо.

1 Ответ

0 голосов
/ 04 января 2019

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

Одним из решений для вашего варианта использования может быть создание логического оператора SQL, предложение которого WHERE будет принимать все ваши параметры и обрабатывать все случаи одновременно. После этого вам нужно выполнить один оператор, независимо от того, какие параметры были выбраны пользователем.

SELECT
    ...
FROM
    company 
    INNER JOIN location ON ...
    INNER JOIN area ON ...
WHERE
    1 = 1
    AND ( :companyActive  = -1 OR company.active  = :companyActive )
    AND ( :locationActive = -1 OR location.active = :locationActive )
    AND ( :areaActive     = -1 OR area.active     = :areaActive )
    ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...