从查询中获得聚合列,并具有多个联接到单个表

麦琪(MaciejJaśniaczyk)

我正在努力推进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中构造适当的条件时,我都会遇到一个问题-显然,当我尝试在添加方法中使用添加连接条件或使用别名时,总是将连接别名转换为表名。我已经用简单的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量,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)内部联接panel_data_has_code pp2 ON(panel_data.PANEL_DATA_ID = pp2.PANEL_DATA_ID)内部联接panel_code p2 ON(pp2.PANEL_CODE_ID = p2.PANEL_CODE_ID)其中p1.TYPE =:p1和p2TYPE。 [LOCAL_ID =:p3 GROUP BY p1.LOCAL_ID] [包装:SQLSTATE [42000]:[Microsoft] [SQL Server Native Client 11.0] [SQL Server]无法绑定多部分标识符\“ panel_code.LOCAL_ID \”。]

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

预先感谢您的任何帮助。

麦琪(MaciejJaśniaczyk)

找到部分解决方案:

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表联接)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何从PHP的单个表中联接Mysql中具有多个条件的多个查询?

尝试将具有单个引用的SQL Server表联接到具有多个引用的表

如何使用联接查询一列中具有多个值的表

无法使用HAVING子句中具有聚合值的子查询表联接中的单值列

单个查询从具有不同列的多个表中获取记录

SQL查询多个表,具有多个联接和带有逗号分隔列表的列字段

Mysql对具有多个列但有很多冗余的两个表进行联接查询

PostgreSQL在单个查询中的多个联接,其中联接的外键在所有表中都不存在

优化具有多个联接的大表上的查询索引

具有where条件的书架查询联接多个表

具有多个表连接的单个查询中的多个计数 - SQL

创建具有多个列和联接列的公式查询

Mongodb聚合与具有多个键的联接

具有多个列的Nhibernate子查询联接

如何在单个查询中使用联接和聚合函数更新表中的多行

在单个视图中具有不同LINQ查询的多个表

SQL查询-使用内部联接获取表中具有ID的多列总和

MySQL多列联接具有多个表引用

在Django中聚合具有多个OuterRef的子查询

查询具有多个值但在同一表的不同表中的多个列

复杂的联接查询,联接具有多个分组依据的3个表

存储过程中具有多个联接的UPDATE表

具有用于2个表的联接的SQL查询,并在第二个表中具有多个外键的结果中创建新的列集

需要单个SQL查询以从具有公共列的2个表中获取结果

MYSQL-具有多个日期的联接-仅从联接中获得第一

将具有键值属性的主表数据联接到另一个以键为列的表中

单个数据库中具有相似列的多个表

具有多个联接的查询缓慢

具有多个联接的SQLAlchemy查询