我在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?
答案 0 :(得分:4)
@ zerofl4g的帮助解决了我的问题。
@ zerofl4g帮助这个雄辩。
$query->select(DB::raw("SELECT MIN(id), name, subj_id FROM tutorials
WHERE completed = 0 GROUP BY subj_id"));
这对我不起作用,但对我帮助很大。我不知道为什么不能形成我的确切原因,但我认为我使用它作为子查询。所以我得到了重复的选择和错误。它肯定适用于想要用作单个查询的人。
我的解决方案只是选择带有DB :: raw的列和来自('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');`
希望有所帮助。
答案 1 :(得分:1)
如果要返回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", 名称:"第2章", subj_id:" 1", 完成:" 0" },{ id:" 3", 名称:"第3章", subj_id:" 1", 完成:" 0" }],
2: [{
id: "6",
name: "chapter 3",
subj_id: "2",
completed: "0"
}, {
id: "7",
name: "chapter 4",
subj_id: "2",
completed: "0"
}]
}
通过在laravel中使用head()辅助函数来预先驱逐每个组并获得最小id。
答案 2 :(得分:0)
正确的查询将类似于
$query->where('completed', false)->get()->groupBy('subj_id');
get()
将在groupBy
之前首先被调用。我的意思是,一旦get()
进行收集,您就可以使用所有收集方法。了解更多详细信息并了解所有收集方法
https://laravel.com/docs/5.8/collections#method-groupby