gpt4 book ai didi

php - Doctrine——选择所有字段并按其中一个分组

转载 作者:可可西里 更新时间:2023-11-01 00:57:24 26 4
gpt4 key购买 nike

我正在尝试使用 doctrine 创建一个查询,它基本上应该类似于 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;
}, []);
}

因为这不是太多的代码,也不会有太多的 »Robots«,我决定 - 遵循 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

关于php - Doctrine——选择所有字段并按其中一个分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37443154/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com