select
count(a.id) as all_a,
sum(ifnull(b.id, 0)) as all_b,
sum(ifnull(c.id, 0)) as all_c
from a left join b using(b_join) left join c using(c_join)
group by a.id
А что говорит тз или продукт овнер на эту тему?
Основных вариантов 3:
1. Сохранять по нажатию кнопки сохранить, независимо от степени заполненности.
2. Сохранять каждый чих пользователя в боевую базу
3. Сохранять каждый чих в сессию, и дальше пункт 1.
А нагрузка большая сейчас и в планах?
Если нет, то я бы сделал несколько запросов:
1. С ограничениями по всем параметрам
2. Последовательно отбрасывая менее весомые критерии.
Если никакие фильтры не вернули ни одного ряда - то все критерии в null
Есть метод getWhatever(), который общий для всех.
Вы можете в конкретном классе реализовать свой getWhatever(), в котором написать parent::getWhatever() и модифицировать общий результат до частного случая.
getWhatever() не должен быть private и final