You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

技术求助:如何查询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();

    // 后续业务逻辑...
}

代码解释:

  1. 排除当前用户:通过where('userId', '!=', $currentUserId)直接过滤掉当前用户的记录
  2. 保证userId+questionId无重复:用groupBy('userId', 'questionId') + havingRaw('COUNT(*) = 1'),确保每个用户对同一个问题只有一条有效记录;如果你的数据库表已经给userId和questionId加了唯一索引,这部分可以简化,直接跳过分组统计,因为数据库已经保证组合唯一
  3. 同一questionId的记录数小于2:通过子查询的结果再次按questionId分组,用COUNT(valid_records.id) < 2确保每个问题最多只有一条符合条件的记录;如果你的需求是ID字段的数值总和小于2,替换成SUM(valid_records.id) < 2即可

内容的提问来源于stack exchange,提问作者user9278936

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:17:10