在Laravel中使用groupby选择最新行

时间:2015-03-20 15:23:14

标签: php mysql laravel

我有一个类似如下的表条目:

+---------+---------+----------+
| Test_id | User_id | Attempts |
+---------+---------+----------+
|      12 |       5 |        1 |
|      13 |       5 |        1 |
|      12 |       5 |        2 |
+---------+---------+----------+

现在我想按test_id选择元素组,并且应该获得最新条目。

我尝试了这个查询:

$tests_took = Testresult::where('course_id', $courseId)
                        ->where('user_id', Auth::id())
                        ->groupby('test_id')
                        ->orderBy('attempts', 'desc')
                        ->get();

当我显示结果时,我只得到前两行(一个test_id只有一行 - 这就是我想要的。)但是,而不是test_id = 12的最后一行,它显示第一行。我总是想要展示最大的尝试。

我目前的输出如下:

|      12 |       5 |        1 |
|      13 |       5 |        1 |

但我想要这个:

|      12 |       5 |        2 |
|      13 |       5 |        1 |

我怎样才能做到这一点?当我使用groupby时,将最新的行作为第一个数组元素,还是有其他方法可以做到这一点?

2 个答案:

答案 0 :(得分:3)

ORDER BYGROUP BY不能很好地协同工作......

如果您只是希望每次test_id尝试次数最多,我建议使用MAX()函数:

$tests_took = Testresult::select('test_id', 'user_id', DB::raw('MAX(attempts) AS max_attempts'))
                ->where('course_id', $courseId)
                ->where('user_id', Auth::id())
                ->groupby('test_id')
                ->get();

答案 1 :(得分:0)

您可以使用以下几行:

 Testresult::select('*')
         ->join(DB::raw('(Select max(id) as last_id from Testresult group by test_id) LatestId'), function($join) {
            $join->on('Testresult.id', '=', 'LatestId.last_id');
            })
         ->orderBy('attempts', 'desc');
}