Коллеги, вопрос наиглупейший!
Поделитесь практикой комбинирования параметрами запроса.
По поводу нативности, я пытаюсь составить максимально оптимальный запрос.
Что я хочу получить?
Количество компаний, в соответствии с заданными параметрами
SQL
Этот запрос на удивление, максимально быстро считает.
EXPLAIN
SELECT COUNT(o.id)
FROM organizations o
LEFT JOIN organizations_categories oc ON o.id = oc.organization_id AND oc.category_id = 9
WHERE o.id IN (
SELECT f.organization_id
FROM features f
WHERE f.name = (
SELECT f2.name
FROM features f2
WHERE f2.id = 5685427
)
)
AND o.city_id = 5128 AND oc.category_id = 9
Таблицы, которые участвуют в запросе
----------------------------------------------------------
- organizations: rows count 5 000 000
- organizations_categorie: rows count 7 000 000
- features: rows count ~7 000 000
----------------------------------------------------------
Привожу пример:
(Заготовка)
0 - означает параметр не передан и не должен учавствовать в запросе.
/**
* @param string $q
* @param int $city_id
* @param int $category_id
* @param int $feature_id
* @return void
* @throws NonUniqueResultException
*/
public function getCount($q = "", int $city_id = 0, int $category_id = 0, int $feature_id = 0)
{
$rsm = new ResultSetMapping;
$rsm->addScalarResult('COUNT(o.id)', 'total');
$query = $this->getEntityManager()->createNativeQuery("
SELECT COUNT(o.id)
FROM organizations o
LEFT JOIN organizations_categories oc ON o.id = oc.organization_id AND oc.category_id = 9
WHERE o.id IN (
SELECT f.organization_id
FROM features f
WHERE f.name = (
SELECT f2.name
FROM features f2
WHERE f2.id = 5685427
)
)
AND o.city_id = 5128 AND oc.category_id = 9
", $rsm);
return $query->getSingleScalarResult();
}
А может есть вариант с помощью билдера?
Да, я пробовал, но он запрос собирает по своим правилам и зачастую эти запросы могут выполнять по 5 минут.
Да, я могу наставить костылей, все будет работать.
Хочу красиво.
Поделитесь практикой.
Спасибо!