IgorPI
@IgorPI

Как комбинировать параметры в нативных запроса?

Коллеги, вопрос наиглупейший!

Поделитесь практикой комбинирования параметрами запроса.
По поводу нативности, я пытаюсь составить максимально оптимальный запрос.

Что я хочу получить?
Количество компаний, в соответствии с заданными параметрами

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


5de3f659bd9d2706856272.png

Таблицы, которые участвуют в запросе
----------------------------------------------------------
- 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 минут.

Да, я могу наставить костылей, все будет работать.
Хочу красиво.

Поделитесь практикой.

Спасибо!
  • Вопрос задан
  • 69 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы