技术求助:如何查询questionId的ID总和<2且userId与questionId组合唯一的数据?
解决多条件数据库查询问题:筛选符合规则的问卷回答数据
我来帮你梳理并实现这个查询需求,结合你使用的Laravel Query Builder,咱们一步步覆盖所有条件:
首先明确你需要满足的三个核心条件:
- 排除当前用户的记录
- 保证
userId和questionId的组合在数据库中无重复 - 同一
questionId对应的记录数(或ID数值总和)小于2
假设你的表名为quest_answers,以下是完整的控制器代码实现:
public function viewSurvey($id) { // 获取当前登录用户ID(如果用Laravel Auth的话) $currentUserId = auth()->id(); // 第一步:筛选出排除当前用户、且userId+questionId无重复的记录 $uniqueUserQuestionRecords = DB::table('quest_answers') ->select('id', 'userId', 'questionId') ->where('userId', '!=', $currentUserId) // 通过分组+统计确保每个用户对每个问题只有一条记录 ->groupBy('userId', 'questionId') ->havingRaw('COUNT(*) = 1'); // 第二步:在上述结果中,筛选每个questionId对应的记录数小于2的条目 // 如果你的需求是"ID数值总和小于2",把COUNT(id)改成SUM(id)即可 $result = DB::table($uniqueUserQuestionRecords, 'valid_records') ->select('valid_records.*') ->groupBy('valid_records.questionId') ->havingRaw('COUNT(valid_records.id) < 2'); // 如果需要关联问卷表(比如根据传入的$id筛选对应问卷的内容),可以添加join // $result = $result->join('surveys', 'valid_records.survey_id', '=', 'surveys.id') // ->where('surveys.id', $id); // 执行查询获取结果 $object = $result->get(); // 后续业务逻辑... }
代码解释:
- 排除当前用户:通过
where('userId', '!=', $currentUserId)直接过滤掉当前用户的记录 - 保证userId+questionId无重复:用
groupBy('userId', 'questionId')+havingRaw('COUNT(*) = 1'),确保每个用户对同一个问题只有一条有效记录;如果你的数据库表已经给userId和questionId加了唯一索引,这部分可以简化,直接跳过分组统计,因为数据库已经保证组合唯一 - 同一questionId的记录数小于2:通过子查询的结果再次按
questionId分组,用COUNT(valid_records.id) < 2确保每个问题最多只有一条符合条件的记录;如果你的需求是ID字段的数值总和小于2,替换成SUM(valid_records.id) < 2即可
内容的提问来源于stack exchange,提问作者user9278936
相关产品推荐
相关产品推荐

