Laravel:如何筛选出需学生重提交的问题(基于最新记录)
筛选学生需重提交的问题ID(Laravel实现)
要找出指定学生名下,**最新答案状态为'reSubmit'**的question_id,核心是先定位每个问题的最新记录,再筛选状态。直接用groupBy('question_id')会默认取分组内的第一条记录,而非最新的,所以得换思路:
方法一:子查询定位最新记录
利用子查询先获取每个question_id对应的最新记录ID(假设ID自增,最新记录ID最大),再关联原表筛选状态:
$studentId = 你要查询的学生ID; $resubmitQuestionIds = Answer::where('student_id', $studentId) // 子查询:获取当前学生每个问题的最新记录ID ->whereIn('id', function ($query) use ($studentId) { $query->select(DB::raw('MAX(id)')) ->from('answers') ->where('student_id', $studentId) ->groupBy('question_id'); }) // 筛选最新记录状态为'reSubmit'的 ->where('status', 'reSubmit') // 提取目标question_id ->pluck('question_id');
方法二:用joinSub关联最新记录
先分组得到每个问题的最新记录ID,再通过关联查询筛选状态:
$studentId = 你要查询的学生ID; // 第一步:获取每个问题的最新记录ID $latestAnswerSub = Answer::select('question_id', DB::raw('MAX(id) as latest_id')) ->where('student_id', $studentId) ->groupBy('question_id'); // 第二步:关联原表,筛选状态为'reSubmit'的记录 $resubmitQuestionIds = Answer::joinSub($latestAnswerSub, 'latest_answers', function ($join) { $join->on('answers.id', '=', 'latest_answers.latest_id'); }) ->where('answers.status', 'reSubmit') ->pluck('answers.question_id');
注意事项
- 如果你的表用
created_at判断最新记录,可将MAX(id)替换为MAX(created_at),但建议用ID(避免同一时间多条提交的冲突)。 - 确保
student_id索引已建立,提升查询效率。
内容的提问来源于stack exchange,提问作者mohammed asheek
相关产品推荐
相关产品推荐

