![](/img/trans.png)
[英]Select first row in each GROUP BY group in mySQL and Laravel?
[英]Laravel eloquent select first row of each group by
我在 SQLite 数据库中有主题表和教程表。 我正在尝试选择当前教程。 有我的桌子
科目表:
------------------- | id | name | ------------------- | 1 | Chemistry | | 2 | Physic | -------------------
教程表:
----------------------------------------- | id | name | subj_id | completed | ----------------------------------------- | 1 | chapter 1 | 1 | 1 | | 2 | chapter 2 | 1 | 0 | | 3 | chapter 3 | 1 | 0 | | 4 | chapter 1 | 2 | 1 | | 5 | chapter 2 | 2 | 1 | | 6 | chapter 3 | 2 | 0 | | 7 | chapter 4 | 2 | 0 | -----------------------------------------
我现在的口才是:
$query->where('completed', false)->groupBy('subj_id')->get();
它返回以下内容:
-----------------------------------------
| id | name | subj_id | completed |
-----------------------------------------
| 3 | chapter 3 | 1 | 0 |
| 7 | chapter 4 | 2 | 0 |
-----------------------------------------
现在我想选择 id 2 和 6。
-----------------------------------------
| id | name | subj_id | completed |
-----------------------------------------
| 2 | chapter 2 | 1 | 0 |
| 6 | chapter 3 | 2 | 0 |
-----------------------------------------
如何使用sqlite获得id 2和6?
@zerofl4g 的帮助解决了我的问题。
@zerofl4g 帮助了这个雄辩。
$query->select(DB::raw("SELECT MIN(id), name, subj_id FROM tutorials
WHERE completed = 0 GROUP BY subj_id"));
它对我不起作用,但对我有很大帮助。 我不知道为什么不能从我这里工作的确切原因,但我认为我将它用作子查询。 所以我得到了重复的选择和错误。 它肯定适用于想要用作单个查询的人。
我的解决方案只是选择带有 DB::raw 的列, ->from('tutorials') 也是可选的,因为它是长查询的子查询
$query->select(DB::raw('MIN(id) as id, name, subj_id'))->from('tutorials')
->where('completed', false)->groupBy('subj_id');
我使用的最终雄辩是
$query->select(DB::raw('MIN(id) as id, name, subj_id'))
->where('completed', false)->groupBy('subj_id');`
希望有所帮助。
如果你想返回 group by 中的第一行,你可以试试下面的代码。 我想你想得到的是该主题未完成的最新章节。
$data = Tutorial::where('completed', 0)->get();
$groups = $data->groupBy('subj_id');
$results = [];
foreach($groups as $group) {
$results[] = head($group);
}
return $results;
获取所有教程行
然后,按subj_id
。 你得到的数据如下
{
1: [{
id: "2",
name: "chapter 2",
subj_id: "1",
completed: "0"
}, {
id: "3",
name: "chapter 3",
subj_id: "1",
completed: "0"
}],
2: [{
id: "6",
name: "chapter 3",
subj_id: "2",
completed: "0"
}, {
id: "7",
name: "chapter 4",
subj_id: "2",
completed: "0"
}]
}
正确的查询将类似于
$query->where('completed', false)->get()->groupBy('subj_id');
get()
将在groupBy
之前groupBy
调用。 我的意思是一旦get()
进行收集,您就可以使用所有收集方法。 欲了解更多详情并了解所有收集方法https://laravel.com/docs/5.8/collections#method-groupby
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.