2017-01-18 13 views
0

難易度に基づいて質問セットから12個の質問を取り出す必要があります。以下は私が書いた質問です。制限値postgresqlで異なる出力を返す連合

(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); 

問題は時々15私は出力の12行を期待して、私はこのクエリを実行するたびに、それは私に結果の異なる数の代わりに、静的な12を与えるたびは、時々私は時々、10、12を得ることです、少なくない、それ以上ではない。

このクエリで何が問題になっていますか?

+0

あなたのクエリがない以上、最大12行を返す必要があります。正確に12を得るには['union all'](https://www.postgresql.org/docs/9.6/static/sql-select.html#SQL-UNION) –

+0

FYI、' UNION'は重複を削除し、 'UNION ALL 'doesn't。無関係のタグを避けるためにしてください –

+0

クエリが12行未満を返す可能性がありますが、12以上を返すことはできない可能性があります。 –

答えて

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 
+0

あなたは私を傷つけませんでした! –

+0

@wingedpanther私は今日誰か他の人が忍者になっているので、私の復讐があなたにあった! :)) –

+0

ありがとう。完璧に動作します。 :) –

関連する問題