Laravel雄辩地选择每组的第一行

时间:2015-04-19 13:51:58

标签: php sqlite laravel

我在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?

3 个答案:

答案 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;
  1. 获取所有教程行

  2. 然后,按' 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"
    }]
    

    }

  3. 通过在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