使用 postgres 和 pomm orm 按错误分组

group by error with postgres and pomm orm

我想执行以下 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: Uncaught PHP Exception InvalidArgumentException:
"No such field 'id'. Existing fields are {date, count}"
at /home/vagrant/sourcefiles/vendor/pomm-project/model-manager/sources/lib/Model/FlexibleEntity/FlexibleContainer.php line 64
{"exception":" [object] (InvalidArgumentException(code: 0): No such field 'id'.
Existing fields are {date, count}
at /home/vagrant/sourcefiles/vendor/pomm-project/model-manager/sources/lib/Model/FlexibleEntity/FlexibleContainer.php:64)"} []

所以我试图在我的 select 中获取 id,但我得到了这个错误:

request.CRITICAL: Uncaught PHP Exception
PommProject\Foundation\Exception\SqlException: "
SQL error state '42803' [ERROR] ==== ERROR: column "e.id" must appear in the GROUP BY clause or be used in an aggregate function LINE 1: SELECT e.id, e.date, COUNT(id_customers) FROM event e WHERE ... ^

==== «PREPARE === SELECT e.id, e.date, COUNT(id_customers) FROM event e WHERE event_id = GROUP BY e.date ===»." at /home/vagrant/sourcefiles/vendor/pomm-project/foundation/sources/lib/Session/Connection.php line 327 {"exception":"[object] (PommProject\Foundation\Exception\SqlException(code: 0): \nSQL error state '42803' [ERROR]\n====\nERROR: column \"e.id\" must appear in the GROUP BY clause or be used in an aggregate function\nLINE 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 = GROUP BY e.date\n ===». at /home/vagrant/sourcefiles/vendor/pomm-project/foundation/sources/lib/Session/Connection.php:327)"} []

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

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

我认为这是因为别名,

试试这个

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

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

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

When GROUP BY is present, it is not valid for the SELECT list expressions to refer to ungrouped columns except within aggregate functions, since there would be more than one possible value to return for an ungrouped column.

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

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

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

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

$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])
;