【问题标题】:Why group by is not working properly? laravel为什么 group by 无法正常工作?拉拉维尔
【发布时间】:2021-07-13 17:50:19
【问题描述】:

我目前正在使用groupBy 对串联的(书名和书名)进行分组。我有意使用groupBy,因为我还有其他列可以获取它们的平均值总和

我最初使用下面的代码。但它返回了一个错误。

Illuminate\Database\QueryException: SQLSTATE[42000]: 语法错误或访问冲突:1055 SELECT 列表的表达式 #1 不在 GROUP BY 子句中并且包含非聚合

Reference::select('*')
    ->selectRaw("CONCAT(book_name, ' ', book_author) AS book")
    ->groupBy('type');

如果我在 groupBy 中添加 id 列,它不会返回错误。但它没有订购,我仍然得到重复的book

Reference::select('*')
    ->selectRaw("CONCAT(book_name, ' ', book_author) AS book")
    ->groupBy(['id', 'type']);

有人,如何正确实现这一点?

【问题讨论】:

  • 一些关系数据库要求在使用“group by”时,每个选定的列必须是“group by”的一部分或使用某些聚合函数(如 max、min、sum 等)聚合。想一想当您想按类型分组时,存储引擎应该如何处理包含唯一值的列“id”?它不能简单地将这些值合并到一行中。

标签: php laravel


【解决方案1】:

TLDR;当您在严格模式下使用 group by 时,您选择的字段必须是聚合字段。

假设您有两本相同类型的书。

book_name book_name type
First author 1
Second editor 1

按类型分组时,具有相同类型的将合并为一个。那么CONCAT(book_name, ' ', book_author) 的结果呢?

  • First author ?
  • Second editor?
  • First editor?
  • Second author?

在严格模式下查询不会赌博,您需要聚合字段,例如LISTAGG(book_name , ',')是字段book_name的聚合,结果为'first,second'

如果您在文件 config/database.php 中禁用严格模式 ('strict' => false,),则结果可能是上面列出的 4 个中的任何一个,因为它有点随机。

聚合函数的其他示例:SUM()AVG()COUNT()...

【讨论】:

  • 如果我将其设置为 false,将来会有什么严重问题吗?
  • @gecko 当然,使用随机数据可能会导致问题。另外,您使用的次数越多,您将永远无法返回严格模式?
【解决方案2】:

请使用以下链接,因为该解决方案已经可用。

Solution Link.

请检查一下,你会找到解决办法的。

【讨论】:

  • 我用的是雄辩的先生。
  • 问题与eloquent无关。它位于 SQL 存储级别
  • 尝试用您真正需要的列列表替换select *
  • 我尝试执行类似的查询,我得到了以下异常 Illuminate\Database\QueryException with message 'SQLSTATE[42000]: Syntax error or access violation: 1055 Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'myshop.front_users.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by (SQL: select id, first_name, last_name, city_id, CONCAT(first_name, ' ', last_name) AS name from front_users` group by city_id)'` 因此我建议您尝试解决方案,它会工作
猜你喜欢
  • 1970-01-01
  • 2017-12-05
  • 1970-01-01
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多