【发布时间】:2020-12-16 14:58:53
【问题描述】:
我的控制器中有一个 SQL 查询,它从表中获取所有数据以按日期对其进行排序。表中有一些重复的 sku_parent 条目具有不同的 id,我想根据“日期”获取每个 sku_parent 的最新条目。这是我的数据库:
+----+-----------+------------+-----------+--------------+------------+---------------------+---------------------+
| id | warehouse | sku_parent | sku_child | case_balance | date | created_at | updated_at |
+----+-----------+------------+-----------+--------------+------------+---------------------+---------------------+
| 5 | SeaWest | 120 | 120 - 25 | 400 | 2020-08-26 | 2020-08-26 19:02:20 | 2020-08-26 19:02:20 |
| 6 | SeaWest | 121 | 121 - 25 | 784 | 2020-08-26 | 2020-08-26 19:02:42 | 2020-08-26 19:02:42 |
| 7 | SeaWest | 121 | 121 - 25 | 734 | 2020-08-26 | 2020-08-26 19:03:46 | 2020-08-26 19:03:46 |
| 8 | SeaWest | 120 | 120 - 25 | 350 | 2020-08-26 | 2020-08-26 19:03:46 | 2020-08-26 19:03:46 |
+----+-----------+------------+-----------+--------------+------------+---------------------+---------------------+
这是我到目前为止所做的:
$data = DB::table('logs')
->where('sku_parent', $request->sku)
->where('id', \DB::raw("(select max(`id`) from logs)"))
->whereBetween('date', array($request->from_date, $request->to_date))
->get();
此代码仅从表中获取最大 id,不显示其他产品名称。我想让每个产品名称都具有最大 id。
【问题讨论】:
-
按作品大概是指只返回两行,因为它没有返回合理的数据。您的第一行显示 ID 为 8,case_balance 为 400,但 ID 为 8 的行的 case_balance 实际上是 350。您的问题仍然有效,即如何在 laravel 中获得每组的前 1 个(其中我不知道,我从未使用过它),但您绝对不应该尝试重新创建该查询。我以前explained with an example 为什么(除非你知道你在做什么)你应该避免这个 MySQL 扩展 group by 子句
-
感谢您提及,我不会使用该查询,有什么方法可以获取我想要的数据吗?
-
您使用的是哪个版本的 MySQL?
-
使用 php my admin 7.4.7
-
我认为下面的查询对你有用:
SELECT ID, sku_parent, sku_child, case_balance , date , created_at, updated_at FROM logs WHERE ID IN (SELECT MAX(ID) FROM logs GROUP BY sku_parent),不过正如我所说,我没有 Laravel 的经验,所以不能为你翻译。一般的原则是获取top 1 per group,所以可能有基于该搜索的答案?
标签: php mysql laravel eloquent greatest-n-per-group