基于question_type_id字段按指定数量查询SQL行的实现方案
按题型ID查询指定数量题目
一、手动指定各题型查询条数
如果需要直接在SQL中定义不同question_type_id对应的查询行数(比如question_type_id=2取2条,question_type_id=3取5条),可以借助窗口函数实现:
适用于MySQL 8.0+/PostgreSQL/SQL Server
SELECT q.question_id, q.question_content, q.question_type_id FROM ( SELECT *, ROW_NUMBER() OVER(PARTITION BY question_type_id ORDER BY question_id) AS row_num, -- 自定义各题型的取数规则 CASE question_type_id WHEN 2 THEN 2 WHEN 3 THEN 5 -- 可添加更多题型规则 ELSE 1 -- 默认取1条 END AS limit_num FROM Questions ) q WHERE q.row_num <= q.limit_num;
二、从QuestionTypes表读取取数规则
如果QuestionTypes表中维护了每个题型对应的查询条数(假设表中有query_count字段存储该值),可以通过关联表实现动态取数:
适用于MySQL 8.0+/PostgreSQL/SQL Server
SELECT q.question_id, q.question_content, q.question_type_id FROM ( SELECT q.*, ROW_NUMBER() OVER(PARTITION BY q.question_type_id ORDER BY q.question_id) AS row_num FROM Questions q JOIN QuestionTypes qt ON q.question_type_id = qt.question_type_id ) q JOIN QuestionTypes qt ON q.question_type_id = qt.question_type_id WHERE q.row_num <= qt.query_count;
三、兼容MySQL 5.x版本(无窗口函数)
如果使用不支持窗口函数的MySQL旧版本,可通过变量实现:
SELECT question_id, question_content, question_type_id FROM ( SELECT *, @row_num := IF(@current_type = question_type_id, @row_num + 1, 1) AS row_num, @current_type := question_type_id FROM Questions, (SELECT @row_num := 0, @current_type := NULL) vars ORDER BY question_type_id, question_id ) q JOIN ( -- 手动定义题型与取数的对应关系,也可替换为关联QuestionTypes表 SELECT 2 AS question_type_id, 2 AS limit_num UNION ALL SELECT 3 AS question_type_id, 5 AS limit_num ) t ON q.question_type_id = t.question_type_id WHERE q.row_num <= t.limit_num;
关键说明
PARTITION BY question_type_id:按题型ID分组,每组内独立编号ORDER BY question_id:指定组内排序规则,保证取数结果的一致性(可替换为创建时间等其他字段)
内容的提问来源于stack exchange,提问作者amralsaidy
相关产品推荐
相关产品推荐

