我想执行以下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}” at /home/vagrant/sourcefiles/vendor/pomm-project/model-manager/sources/lib/Model/FlexibleEntity/FlexibleContainer.php第64行 {“exception”:“[object](InvalidArgumentException(code:0):没有这样的字段'id'。
现有字段为{date,count}
at /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'[错误] ====错误:列“e.id”必须出现在GROUP BY子句中或用于聚合函数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 = $ 1 GROUP BY e.date ===»。“at / home / vagrant / sourcefiles /vendor/pomm-project/foundation/sources/lib/Session/Connection.php第327行{“exception”:“[object](PommProject \ Foundation \ Exception \ SqlException(code:0):\ n SQL错误状态'42803' [错误] \ n ==== \ nERROR:列\“e.id \”必须出现在GROUP BY子句中或用于聚合函数\ 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 = $ 1 GROUP BY e .date \ n ===»。at /home/vagrant/sourcefiles/vendor/pomm-project/foundation/sources/lib/Session/Connection.php:327)"} []
唯一可行的是当我在群组中拥有id时,但这不是我想要的结果。
有人可以解释一下为什么这个在数据库中工作而不是在php中?
答案 0 :(得分: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])
;
答案 1 :(得分:0)
我认为它是因为别名,
试试这个
$sql = "SELECT e.date, COUNT(e.id_customers) FROM event e WHERE event_id = $* GROUP BY e.date";
return $this->query($sql, [$eventId])->extract();
答案 2 :(得分:0)
这正是GROUP BY
在PostgreSQL中的作用:
当GROUP BY存在时,它对SELECT列表无效 用于引用未聚合列的表达式,但在聚合中除外 函数,因为将返回多个可能的值 对于未分组的列。
这意味着查询中的每个字段必须存在于GROUP BY
语句中或由任何聚合函数处理。这是MySQL和PostreSQL中GROUP BY
之间的差异之一。
换句话说,您可以在id
语句中添加GROUP BY
而不用担心;)