【问题标题】:(Laravel) can't use group by with order by [duplicate](Laravel)不能使用 group by 和 order by [重复]
【发布时间】:2019-01-07 15:05:29
【问题描述】:

我正在尝试使用 order by 而不在 groupby 中添加 order 列,它只有在我直接从数据库执行但从 laravel 中得到数据库错误时才有效

我做了这个雄辩的代码

Comment::select('product_id')->where('shop_name', $shop)->groupby('product_id')->distinct()->orderBy('created_at')->paginate(12)

它将产生以下查询

comments 中选择不同的 DISTINCT(product_id),其中shop_name = 'shopname' group by product_id order by created_at asc limit 12 offset 0

如果我直接在数据库中查询上述查询,它就可以工作

但是如果我使用 Laravel 雄辩的代码,它会触发这个错误

SQLSTATE[42000]:语法错误或访问冲突:1055 'areviews_areviewzappz.cmets.created_at' 不在 GROUP BY 中(SQL: 从comments 中选择不同的 DISTINCT(product_id),其中shop_name = 'shopname' group by product_id order by created_at asc limit 12 offset 0)

我该如何解决这个问题?

【问题讨论】:

  • 您可以在groupBy 中添加created_at
  • distinct DISTINCT(product_id) 是什么? DISTINCT 是关键字而不是 MySQL 中的函数我想知道为什么 laravel 会生成这个 SQL?除了 DISTINCT 生成双倍..“如果我直接在数据库中摩擦上述查询,它可以工作”是的,它“工作”,但你可以获得 无效数据,因为它不是 ANSI SQL 有效..

标签: php mysql database laravel eloquent


【解决方案1】:

问题是您应该真正将 ORDER BY 包含在 GROUP BY 列表中,因为这是最佳做法。

当您将 sql 模式设置为 '' 时它起作用的原因。但是,默认情况下(我认为)Laravel 的 Strict 为 TRUE,

你有两个选择:

  1. 将 created_at 添加到 GROUP BY 子句(推荐)
  2. 将严格模式更改为 false

关于第二个选项的更多信息:

How can I solve incompatible with sql_mode=only_full_group_by in laravel eloquent?

【讨论】:

  • 您好,如果我同时包含两者,我会在分页中得到不同的结果。如果我只使用 product_id,我会得到 88 页,但如果我按照你的建议将 product_id 与 created_at 一起使用,我将得到 4444 页,这不是我想要的。我会检查第二个解决方案,这可能是我需要的,谢谢。
  • 将严格模式更改为 false 解决了该问题。非常感谢
【解决方案2】:

您可以在检索结果后而不是在 MySQL 查询中对其进行分组 - 因此您可以在检索到集合后对集合进行分组,而不是查询本身中的表条目。

Comment::select('product_id')
   ->where('shop_name', $shop)
   ->distinct()
   ->orderBy('created_at')
   ->paginate(12)
   ->groupBy('product_id')

Laravel 集合groupBy 方法:https://laravel.com/docs/5.7/collections#method-groupby

相关帖子:Laravel Query Buider Group By Not Getting All The Records

【讨论】:

  • 如果我这样做,我会遇到分页问题,​​因为它可能会获取这家商店的所有数据库记录,如果它是 7500 页,但如果我使用 group by,我只会得到 88 页,因此它不会使用分页会得到错误的数据
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-30
  • 2011-06-28
相关资源
最近更新 更多