Laravel eloquent 选择每组的第一行

Rya*_*lay 4 php sqlite laravel

我在 SQLite 数据库中有主题表和教程表。我正在尝试选择当前教程。有我的桌子

  • 科目表:

    -------------------
    |  id |   name    |
    -------------------
    |  1  | Chemistry |
    |  2  | Physic    |
    -------------------
    
    Run Code Online (Sandbox Code Playgroud)
  • 教程表:

    -----------------------------------------
    | 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     |
    -----------------------------------------
    
    Run Code Online (Sandbox Code Playgroud)

我现在的口才是:

  $query->where('completed', false)->groupBy('subj_id')->get();
Run Code Online (Sandbox Code Playgroud)

它返回以下内容:

-----------------------------------------
| id  |    name   | subj_id | completed |
-----------------------------------------
|  3  | chapter 3 |   1     |     0     |
|  7  | chapter 4 |   2     |     0     |
-----------------------------------------
Run Code Online (Sandbox Code Playgroud)

现在我想选择 id 2 和 6。

-----------------------------------------
| id  |    name   | subj_id | completed |
-----------------------------------------
|  2  | chapter 2 |   1     |     0     |
|  6  | chapter 3 |   2     |     0     |
-----------------------------------------
Run Code Online (Sandbox Code Playgroud)

如何使用sqlite获得id 2和6?

Rya*_*lay 7

@zerofl4g 的帮助解决了我的问题。

@zerofl4g 帮助了这个雄辩。

$query->select(DB::raw("SELECT MIN(id), name, subj_id FROM tutorials
 WHERE completed = 0 GROUP BY subj_id"));
Run Code Online (Sandbox Code Playgroud)

它对我不起作用,但对我有很大帮助。我不知道为什么不能从我这里工作的确切原因,但我认为我将它用作子查询。所以我得到了重复的选择和错误。它肯定适用于想要用作单个查询的人。

我的解决方案只是选择带有 DB::raw 的列, ->from('tutorials') 也是可选的,因为它是长查询的子查询

$query->select(DB::raw('MIN(id) as id, name, subj_id'))->from('tutorials')
->where('completed', false)->groupBy('subj_id');
Run Code Online (Sandbox Code Playgroud)

我使用的最终雄辩是

$query->select(DB::raw('MIN(id) as id, name, subj_id'))
->where('completed', false)->groupBy('subj_id');`
Run Code Online (Sandbox Code Playgroud)

希望有所帮助。