【问题标题】:How to group by foreign keys and also retrieve other column values in laravel eloquent如何按外键分组并在 laravel eloquent 中检索其他列值
【发布时间】:2015-10-18 03:16:00
【问题描述】:

我正在尝试执行以下查询:

return Book::select('id', 'title', 'author_id')->groupBy('author_id')->get();

然后它返回

分组错误:7 错误:列“book.id”必须出现在 GROUP BY 子句中或用于聚合函数中。

【问题讨论】:

  • 您实际上想检索什么?同一作者并排列出的书籍?
  • 不,只有每位作者的最新书籍。顺便说一句,这是一个伪代码。
  • 这不是伪代码,而是无效的有效代码。尝试直接针对您的数据库 (MySQLWorkBench) 编写 SELECT 语句以了解您需要什么 SQL,然后弄清楚如何让 Eloquent 生成该 SQL。
  • 你用的是什么数据库?
  • 你想用什么标准来定义什么是“最新”的书?最后一个?约会?

标签: postgresql laravel eloquent


【解决方案1】:

不幸的是,使用 PostgreSQL 运行这样的查询是不可能的,因为它要求 SELECT 列表中指定的所有字段都是 GROUP BY 表达式的一部分。 p>

您可以在此处阅读其背后的基本原理:http://www.postgresql.org/docs/current/static/sql-select.html#SQL-GROUPBY

【讨论】:

  • 如果你分组的列是表的主键,也不是完全不可能的。
  • 但是,如果你按主键分组,你只是获取所有没有分组的记录,不是吗?
【解决方案2】:

您编写的查询没有任何问题...它可以与其他数据库(如 Mysql 和 sqlite)一起使用没有问题... 问题是你对 postgreSQL 的基础知识不清楚

对于 Mysql:它将为一位作者获取任意一行并获取 author_id 列,对于其他两列(id 和标题)从匹配作者的行中获取任何随机值..

但对于 postgreSQL 却不是这样,

postgreSQL stats 的文档,在 select 子句中引用的任何和所有列都必须在 group by 子句中使用,唯一的例外是如果您在聚合函数中使用列名,例如 min、max .etc ,您需要提及group by 子句中的列名

因此你的错误

【讨论】:

  • 我想,既然我在使用 Eloquent,或许 Laravel 应该将其抽象化。反正我要学postgreSQL。
  • Laravel 不能这样做有两个原因..1.group by 条件是业务逻辑的一部分 2. group by 的顺序可以极大地改变你的输出..因此我认为 eloquent 不应该内部做
  • 因此,Collection 类确实有一个 groupBy 方法,也许 OP 可以使用。
  • 它可能在 MySQL 中工作 - 但只是因为 MySQL 不会拒绝无效的 SQL,而是在 GROUP BY 使用不正确时返回随机结果。
  • 对于 MySQL ,这不是一个无效的 sql 语句..我宁愿说,它是一个不完整的 sql 语句..正如我提到的,它不会出错..但是对于其他两列(一个不在分组依据)值将是每个组的结果子集中的随机匹配
猜你喜欢
  • 2021-10-02
  • 1970-01-01
  • 2021-09-03
  • 1970-01-01
  • 2017-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-28
相关资源
最近更新 更多