我必须根据难度级别从我的问题集中提取12个问题.以下是我写的查询.
(SELECT q.question_text, q.option_a, q.option_b, q.option_c, q.option_d, q.correct_answer, q.image_link, q.question_type FROM questions_bank q JOIN sports_type st ON st.id = q.sports_type_id JOIN difficulty_level dl ON dl.id = q.difficulty_level_id WHERE st.game_type = LOWER('cricket') AND dl.value = 'E' ORDER BY random() LIMIT 7) UNION (SELECT q.question_text, q.option_a, q.option_b, q.option_c, q.option_d, q.correct_answer, q.image_link, q.question_type FROM questions_bank q JOIN sports_type st ON st.id = q.sports_type_id JOIN difficulty_level dl ON dl.id = q.difficulty_level_id WHERE st.game_type = LOWER('cricket') AND dl.value = 'M' ORDER BY random() LIMIT 4) UNION (SELECT q.question_text, q.option_a, q.option_b, q.option_c, q.option_d, q.correct_answer, q.image_link, q.question_type FROM questions_bank q JOIN sports_type st ON st.id = q.sports_type_id JOIN difficulty_level dl ON dl.id = q.difficulty_level_id WHERE st.game_type = LOWER('cricket') AND dl.value = 'H' ORDER BY random() LIMIT 1);
问题是每当我运行这个查询时,每次它给我一个不同数量的结果而不是静态12.有时我得到12,有时10,有时是15.我期望输出12行,而不是更少,不是更多.
这个查询有什么问题?
可以使用窗口函数将其缩减为单个选择:
select * from ( select row_number() over (partition by dl.value order by random()) as rn, dl.value, q.question_text, q.option_a, q.option_b, q.option_c, q.option_d, q.correct_answer, q.image_link, q.question_type from questions_bank q inner join sports_type st on st.id = q.sports_type_id inner join difficulty_level dl on dl.id = q.difficulty_level_id where st.game_type = lower('cricket') and dl.value in ('E','M','H') ) s where value = 'E' and rn <= 7 or value = 'M' and rn <= 4 or value = 'H' and rn = 1