首页 > 解决方案 > 将 3 个查询缩减为单个 SQL 查询以进行服务器端分页

问题描述

本质上,我需要在单个查询中恢复 3 个查询的结果(用于服务器端分页排序)。这有点复杂。

这是包含必填字段的图表。

e

我需要的两列结果被认为是与功能相关的任务(计数)。

第一个查询成功恢复了我需要的所有行,除了两行。

SELECT DISTINCT vue_cdc_for_opera.libelle as CDC,
                               vue_cdc_for_opera.id_cdc as \"id\",
                               COALESCE(vue_cdc_for_opera.signe_ue, vue_cdc_for_opera.signe_fr) as Signe,
                               vue_cdc_for_opera.classe_ue as \"Classe produit\",
                               vue_cdc_for_opera.code_cdc as \"Code CDC\",
                               dt_bdd_produit.libelle_dt as DT,
                               0 as \"Nombre OCO\",
                               0 as \"Nombre Operateur\"
                FROM vue_cdc_for_opera
                    INNER JOIN cdc_postgresql ON vue_cdc_for_opera.code_cdc = cdc_postgresql.code_cdc
                    INNER JOIN dt_bdd_produit ON vue_cdc_for_opera.id_dt = dt_bdd_produit.id_dt
                    ORDER BY " . $order . " " . $sortOrder . "
                    OFFSET :offset
                    LIMIT :limit

为了获得“Nombre Operateur”,我运行以下查询:

  SELECT
            COUNT(o.id) as \"Nombre Opérateurs\"
            FROM habilitation
            INNER JOIN operateur o ON habilitation.id_operateur = o.id and o.actif = true
            WHERE habilitation.id_cdc_postgresql = :idCdc
            AND habilitation.actif = true

为了获得“Nombre OCO”,我运行以下查询:

SELECT id_oc, oc FROM vue_for_lien_oco_cdc WHERE oc != '' AND code_cdc = :codeCdc;

本质上,我需要在单个查询中恢复所有内容,以便能够在服务器端分页中订购“Nombre Operateur”和“Nombre OCO”,这超出了我目前的 SQL 技能。:params稍后在 PHP 代码中引用绑定参数。

我被告知可以在查询中使用内置 SQL 函数,但我不确定从哪里开始。这是可行的,你有什么线索或可以提供帮助吗?

标签: sqlpostgresqlsymfony

解决方案


我不知道如何在第一个和第二个查询中使用 DQL 执行 COALESCE 和 ON,但对于最新的我们可以:

$qb->createQueryBuilder('o')
->from(<insert your entity class here>)
->where('o.oc <> ""')
->andWhere('o.code_cdc = :codeCdc')->setParameter('codeCdc',$<insert variable for code_cdc>)
->getQuery()
->getResult();

推荐阅读