【问题标题】:Get aggregated column from query with multiple joins to single table从具有多个连接的查询中获取聚合列到单个表
【发布时间】:2013-10-24 07:49:05
【问题描述】:

我正在努力在推进 1.6.7 中检索数据。

这是我想要实现的查询示例:

select count(1) as amount, p1.local_id FROM panel_data pd
         JOIN panel_data_has_code pp1 on (pd.panel_data_id = pp1.panel_data_id)
         JOIN panel_code p1 on (pp1.panel_code_id = p1.panel_code_id AND p1.type='equipment'  AND model_id = 'my_model_id')
         JOIN panel_data_has_code pp2 on (pd.panel_data_id = pp2.panel_data_id)
         JOIN panel_code p2 on (pp2.panel_code_id = p2.panel_code_id AND p2.type='model' AND p2.local_id='my_local_id') 
         GROUP BY p1.local_id

但是,每当我尝试在 Propel ORM 中构建适当的标准时,我都会遇到问题 - 显然,每当我尝试在 select 方法中使用添加连接条件或使用别名时,propel 总是将连接别名转换为表名。我已经用简单的filterBy 方法替换了多个连接条件(我总是使用内部连接,所以效果是一样的),但我仍然遇到检索分组列(p1.local_id)的问题。

这是我使用 atm 的代码:

PanelDataQuery::create()
            ->select(array( 'p1.localId'))
            ->withColumn('count(1)', 'amount')
            ->usePanelDataHasCodeQuery('pp1')->usePanelCodeQuery('p1')->groupByLocalId()->filterByType($type)->endUse()->endUse()
            ->usePanelDataHasCodeQuery('pp2')->usePanelCodeQuery('p2')->filterByType('model')->filterByLocalId($model)->endUse()->endUse()
            ->find();

以上语句返回错误:

无法执行 SELECT 语句 [SELECT count(1) AS amount, panel_code.LOCAL_ID AS \"p1.localId\" FROM panel_data INNER JOIN panel_data_has_code pp1 ON (panel_data.PANEL_DATA_ID=pp1.PANEL_DATA_ID) INNER JOIN panel_code p1 ON ( pp1.PANEL_CODE_ID=p1.PANEL_CODE_ID) INNER JOIN panel_data_has_code pp2 ON (panel_data.PANEL_DATA_ID=pp2.PANEL_DATA_ID) INNER JOIN panel_code p2 ON (pp2.PANEL_CODE_ID=p2.PANEL_CODE_ID) WHERE p1.TYPE=:p1 AND p2.TYPE=:p2 AND p2.LOCAL_ID=:p3 GROUP BY p1.LOCAL_ID] [wrapped: SQLSTATE[42000]: [Microsoft][SQL Server Native Client 11.0][SQL Server]多部分标识符 \"panel_code.LOCAL_ID\" 不能绑定。]

显然,select 子句会导致问题。任何想法如何强制推进使用表别名而不是将其转换为表名?

提前感谢您的帮助。

【问题讨论】:

    标签: php sql sql-server join propel


    【解决方案1】:

    找到部分解决方案:

    PanelDataQuery::create()
        ->withColumn('p1.local_id','localId')
        ->withColumn('count(1)', 'amount')
        ->select(array( 'localId','amount'))
        [...]
    

    似乎工作正常。 Altought我会很感激任何其他解决方案。如何处理 addJoinCondition 中的类似问题仍然会很棒。

    当我替换时:

    ->filterByType('model')->filterByLocalId($model)
    

    来自原始查询,带有:

    ->addJoinCondition('p2', 'p2.localId = ?', $model)
    ->addJoinCondition('p2', "p2.type = 'model'");
    

    我遇到了与错误中所述类似的问题:propel 将 p2.localId 转换为不正确的 panel_code.local_id(查询中包含多个带有别名的 panel_code 表连接)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-20
      • 2010-09-14
      • 2017-05-25
      • 2017-05-12
      • 1970-01-01
      • 2018-05-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多