【问题标题】:group by error with postgres and pomm orm使用 postgres 和 pomm orm 按错误分组
【发布时间】:2023-03-30 17:12:02
【问题描述】:

我要执行以下 SQL 查询:

SELECT date, COUNT(id_customers) 
FROM event 
WHERE event_id = 3  
GROUP BY date

当我在我的数据库中尝试这个查询时,它运行良好。但在我的代码中,我得到了一个我无法解决的错误。

我使用 symfony2 和 orm pomm。它是 Postgresql。

这是我的代码:

$sql = "SELECT e.date, COUNT(id_customers) FROM event e WHERE event_id = $* GROUP BY e.date";

return $this->query($sql, [$eventId])->extract();

这是错误:

request.CRITICAL:未捕获的 PHP 异常 InvalidArgumentException:
“没有这样的字段 'id'。现有字段是 {date, count}”
在 /home/vagrant/sourcefiles/vendor/pomm-project/model-manager/sources/lib/Model/FlexibleEntity/FlexibleContainer.php 第 64 行
{"exception":" [object] (InvalidArgumentException(code: 0): No such field 'id'.
现有字段为 {date, count}
在 /home/vagrant/sourcefiles/vendor/pomm-project/model-manager/sources/lib/Model/FlexibleEntity/FlexibleContainer.php:64)"} []

所以我尝试在我的选择中包含 id,但出现此错误:

request.CRITICAL:未捕获的 PHP 异常
PommProject\Foundation\Exception\SqlException:“
SQL 错误状态 '42803' [ERROR] ==== 错误:列“e.id”必须出现在 GROUP BY 子句中或用于聚合函数第 1 行:SELECT e.id, e.date, COUNT(id_customers ) FROM 事件 e WHERE ... ^

==== «PREPARE === SELECT e.id, e.date, COUNT(id_customers) FROM event e WHERE event_id = $1 GROUP BY e.date ===»。”在 /home/vagrant/sourcefiles /vendor/pomm-project/foundation/sources/lib/Session/Connection.php 第 327 行 {"exception":"[object] (PommProject\Foundation\Exception\SqlException(code: 0): \nSQL 错误状态 '42803' [错误]\n====\n错误:列 \"e.id\" 必须出现在 GROUP BY 子句中或用于聚合函数\n第 1 行:SELECT e.id, e.date, COUNT(id_customers ) FROM event e WHERE ...\n ^\n\n====\n«PREPARE ===\nSELECT e.id, e.date, COUNT(id_customers) FROM event e WHERE event_id = $1 GROUP BY e .date\n ===». at /home/vagrant/sourcefiles/vendor/pomm-project/foundation/sources/lib/Session/Connection.php:327)"} []

唯一有效的是当我在 group by 中有 id 时,但这不是我想要的结果。

有人可以解释一下为什么这在数据库中而不是在 php 中有效?

【问题讨论】:

    标签: postgresql symfony pomm


    【解决方案1】:

    这是因为您正在获取没有主键的灵活实体。后台有一个身份映射器,可确保获取两次相同的实体将返回相同的实例。

    在这种情况下,您不需要获取实体(因此查询后的extract)。所以你可以使用QueryManager pooler 来返回转换后的数组,如下所示:

    $sql = "SELECT e.date, COUNT(id_customers) FROM event e WHERE event_id = $* GROUP BY e.date";
    
    // Return an iterator that fetches converted arrays on demand:
    return $this
        ->getSession()
        ->getQueryManager()
        ->query($sql, [$eventId])
    ;
    

    【讨论】:

      【解决方案2】:

      我认为是因为别名,

      试试这个

      $sql = "SELECT e.date, COUNT(e.id_customers) FROM event e WHERE event_id = $* GROUP BY e.date";
      
      return $this->query($sql, [$eventId])->extract(); 
      

      【讨论】:

        【解决方案3】:

        这正是GROUP BY 在 PostgreSQL 中的工作方式:

        当 GROUP BY 存在时,它对 SELECT 列表无效 引用除聚合之外的未分组列的表达式 函数,因为返回的可能值不止一个 对于未分组的列。

        这意味着查询中的每个字段要么必须出现在GROUP BY 语句中,要么由任何聚合函数处理。这是 MySQL 和 PostreSQL 中的GROUP BY 之间的区别之一。

        换句话说,您可以在GROUP BY 声明中添加id,不用担心;)

        【讨论】:

        • 感谢您的回答。但我不明白为什么它在数据库中工作。此外,我无法在 group by 中添加 id,因为它会改变我想要的结果。而且我不明白为什么我必须输入 id 而我什至不在选择中使用它。这是哪里来的?
        • 嗯不确定,我想您需要深入挖掘并调试 FlexibleContainer::fields 方法
        猜你喜欢
        • 2011-10-19
        • 2019-07-09
        • 1970-01-01
        • 2017-03-30
        • 1970-01-01
        • 2018-08-12
        • 1970-01-01
        • 2012-04-26
        • 2018-03-10
        相关资源
        最近更新 更多