从具有多个连接的查询中获取聚合列到单个表

时间:2013-10-16 09:08:57

标签: php sql sql-server join propel

我正在努力修复推进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中构建适当的标准时,我遇到了一个问题 - 显然,每当我尝试使用add join条件或在select方法中使用别名时,总是将连接别名转换为表名。我已经用简单的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子句会导致问题。任何想法如何强制推动使用表别名而不是将其转换为表名?

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

找到部分解决方案:

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'");

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