You need to enable JavaScript to run this app. MySQL查询为各题目关联选项批量标注A/B/C/D,避免额外循环
优惠活动
大模型
产品
解决方案
定价
更多

MySQL查询为各题目关联选项批量标注A/B/C/D,避免额外循环

问答测验功能的选项序号标注需求

需求说明

我正在开发问答测验功能,原实现思路为:

  • 先执行一次查询拉取全部20道题目
  • 遍历题目列表,每轮循环传入当前题目的ID,查询该题目下关联的所有选项

当前核心优化目标:无需逐题循环查询,即可自动为同题目下的所有选项按顺序标注A、B、C、D格式的选项序号。

选项表结构

id    option_value       question_id
1      some value          1
2      some value          1
3      some value          1
4      some value          1
5      some value          2
6      some value          2
7      some value          2
8      some value          2

预期输出格式

option_id   option_name option_value
 1           A           some value
 2           B           some value
 3           C           some value
 4           D           some value
 5           A           some value
 6           B           some value
 7           C           some value
 8           D           some value

现有代码逻辑

// $question_list 存储select *查询得到的全部20道题目
$question_list
foreach($question_list as $list){
    // 注意:原代码字段拼写错误,option_vaue 应为 option_value
    $this->db->select('id, option_value')->from('option')
        ->where('question_id', $list->id)
        ->order_by('id','asc')
        ->get()
        ->result();
}

实现方案

直接用单条SQL完成全量选项查询和序号标注,不需要提前拉取题目列表再逐题循环:

SELECT
    id AS option_id,
    CHAR(ASCII('A') + (ROW_NUMBER() OVER (PARTITION BY question_id ORDER BY id ASC) - 1)) AS option_name,
    option_value
FROM `option`
ORDER BY question_id ASC, id ASC;
  • 该逻辑通过窗口函数按question_id分组,同分组内按选项ID升序生成连续行号
  • 将行号映射为从A开始的大写字母,完全匹配预期的输出格式
  • 一次查询即可返回所有题目对应的所有选项,彻底移除逐题循环查库的逻辑

兼容性说明:若使用不支持窗口函数的低版本数据库(如MySQL 5.x),可通过自定义会话变量实现分组排序的等价效果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.01 13:24:05