В программе, над которой я работаю, есть запрос, работающий по иерархической структуре таблиц. У меня есть таблица компаний, у каждой компании есть местоположения (которые имеют свою собственную таблицу), у каждого местоположения есть области, у каждой области есть активы, и у каждого актива есть проекты. Все они (компания, местоположение, область, актив, проект) имеют логическое поле 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
.
РЕДАКТИРОВАТЬ: После некоторого тестирования этот запрос НЕ был тем, что замедлял мою программу, так что это было ненужным, ха-ха, однако сегодня я узнал что-то новое, так что, ребята, спасибо.