我必须根据难度级别从我的问题集中提取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行,而不是更少,不多。
此查询有什么问题?
答案 0 :(得分:5)
可以使用窗口函数将其缩减为单个选择:
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