【问题标题】:Laravel Query Builder - groupBy, map, sortBy / orderByLaravel 查询生成器 - groupBy、map、sortBy / orderBy
【发布时间】:2018-11-25 14:30:26
【问题描述】:

这个想法是从订单表中获取最畅销的产品。

Order::select('product_id', 'price')->get()->groupBy('product_id')
    ->map(function ($row) {
       return $row->count('product_id');
});

订单表如下所示

我得到类似的东西:

product_id: count

"8" : 2,
"34": 1,
"36": 1,
"28": 1,
"31": 1,
"40": 1,
"44": 1,
"46": 1,
"47": 2

但我仍然需要按数量订购。我该怎么做?

预期

"8" : 2,
"47": 2,
"34": 1,
"36": 1,
"28": 1,
"31": 1,
"40": 1,
"44": 1,
"46": 1,

【问题讨论】:

  • 您能否提供更多关于您的要求的详细信息
  • 您可以在您的收藏中使用sortBysortByDesc 方法。
  • @adam,怎么样?你能给我一个示例代码吗?我试过了,但我没有得到我需要的东西
  • @SagarGautam,我已经更新了我的问题。
  • @owen 我已经添加了答案,请花点时间尝试解决方案。

标签: php mysql laravel query-builder


【解决方案1】:

您可以在您的收藏中使用sortBy 方法:

Order::select('product_id', 'price')->get()->groupBy('product_id')
->map(function ($row) {
   return $row->count('product_id');
})->sortBy('count');

如果要降序排序:

Order::select('product_id', 'price')->get()->groupBy('product_id')
->map(function ($row) {
   return $row->count('product_id');
})->sortByDesc('count');

如果你想使用 sql 排序:

Order::select('product_id', 'price',\DB::raw('COUNT(product_id) as count'))
->groupBy('product_id', 'price')
->orderBy('count')->get();

注意:您可能需要在 ->groupBy 的 select 子句中指定列:

->groupBy('product_id', 'price')

【讨论】:

  • 注意:您可能需要在您的 ->groupBy: 中指定您的 select 子句中的列,给我一个解决这个问题的重要线索。我最终不得不从 ::select() 中删除 'price',因为我只想按 'product_id_count' 分组。谢谢!
【解决方案2】:

试试这个,

Order::select('product_id', 'price',\DB::raw('COUNT(product_id) as count'))->groupBy('product_id')->orderBy('count')->get();

这里,原始查询用于对产品ID进行计数,然后进行分组,以便我们可以获取每个产品ID的计数,然后根据要求最终按计数排序。

希望您能理解,如果需要对上述代码进行任何解释,请随时提问。

【讨论】:

  • 我收到此错误。 SQLSTATE[42000]:语法错误或访问冲突:1055 SELECT 列表的表达式 #2 不在 GROUP BY 子句中,并且包含在功能上不依赖于 GROUP BY 子句中的列的非聚合列“database.orders.price”;这与 sql_mode=only_full_group_by 不兼容(SQL: select product_id, price, COUNT(product_id) as count from orders group by product_id order by count asc)
【解决方案3】:

你需要做这样的事情:

Order::select('product_id', 'price',\DB::raw("COUNT('product_id') as product_count"))->groupBy('product_id')->havingRaw("COUNT('product_id') > ?", [0])->orderBy('product_id','ASC')->get();

【讨论】:

  • 您的代码按 product_id 排序。我需要的是按product_id的计数排序
  • 我更新了我的答案,你能检查一下这是否适合你吗?
  • 嗯。没运气。我得到这个错误。 SQLSTATE [42000]:语法错误或访问冲突:1055 SELECT 列表的表达式 #2 不在 GROUP BY 子句中,并且包含在功能上不依赖于 GROUP BY 子句中的列的非聚合列“database.orders.price”;这与 sql_mode=only_full_group_by 不兼容(SQL: select product_id, price, COUNT('product_id') as product_count from orders group by product_id order by product_id asc)
  • 嗯,也许this可以帮助你
  • @owen 您需要将 select 子句中的列与您的分组依据相匹配。因此,如果您的 select 子句包含 product_id,并且 group by 的价格也需要指定这些列。 product_count 列在计算时不需要在 group by 子句中使用。
猜你喜欢
  • 2018-10-23
  • 2018-06-26
  • 2016-07-21
  • 1970-01-01
  • 1970-01-01
  • 2018-05-12
  • 2016-09-28
  • 2015-12-13
  • 1970-01-01
相关资源
最近更新 更多