我正在尝试创建一个带有学说的查询,该查询在sql中基本上应该看起来像这样:
SELECT p.* FROM some_tabel AS p GROUP BY p.type;
所以我结束了,因为这是我发现的最接近的记录:
private function getAll()
{
//$this->em => Entity Manager
return $this->em->createqueryBuilder()
->select('p')
->from('AppBundle:Robots', 'p')
->groupBy('p.type')
->getQuery()
->getResult(Query::HYdratE_ARRAY);
}
该错误告诉我未选择“ p.type”.
我该如何工作?
更新
如@Felippe Duarte的公认答案中所述,似乎MysqL的分组是一种有线连接.即使我跑步:
SELECT p.*, max(p.id) FROM some_tabel AS p GROUP BY p.type;
正如许多答案所建议的那样,结果不是我所期望的,因为仅包括每种类型的第一项,并且没有发生真正的分组.
排序而不是分组的选项很好,但是仍然给我一些处理,因此在这种情况下是多余的.
最后这段代码满足了我的需要:
private function groupByType(array $robots)
{
return array_reduce($robots,
function($list, $robot)
{
$list[$robot->getType()][] = $robot;
return $list;
}, []);
}
因为这不是太多的代码,并且不会有太多的“机器人”,所以我决定-遵循KISS范例-这是首选的解决方案.
解决方法:
您不能按单个列分组,然后选择其他列. MysqL具有此“错误”,允许用户在选择许多列的同时按一列分组.
换句话说,您必须按未使用聚合函数的所有列进行分组,例如SUM,AVG,MAX,COUNT.
MysqL的“功能”的副作用是,即使它不代表事实,也将返回其他列的第一个结果.
试试这个脚本:
create table test(id int, name char(1), value1 int);
insert into test values(1, 'a', 1);
insert into test values(2, 'b', 1);
select name, value1, max(id) from test group by value1;
“预期”输出:
name: 'b', value1: 1, max(id): 2
实际输出:
name: 'a', value1: 1, max(id): 2