簡體   English   中英

Laravel eloquent 選擇每組的第一行

[英]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;
  1. 獲取所有教程行

  2. 然后,按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"
    }]
}
  1. 使用laravel中的head()輔助函數對每個組進行foreach並獲取最小id。

正確的查詢將類似於

$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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM