微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

php-主义-选择所有字段并按其中之一分组

我正在尝试创建一个带有学说的查询,该查询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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐