これは、Yの例ごとのTOPXレコードの別の例です。すべての質問に対して、4つの答えが必要です。制限は実際には2回必要です...最初に適格な質問を制限し、質問結果セットごとに常に「正しい」回答が含まれることを保証する回答の別の「ランク付け」。
したがって、私のアプローチは、最初に質問に対してランダムを適用してサブセットの結果として取得し、次にそれを回答に結合してYごとにXを制限することです。その後、すべてをまとめることができます。ここで重要なのは、内部クエリを質問IDで並べ替える必要があることです...そして、修飾子「正解」は常に最初の位置にありますが、それ以降はランダム化されて合計4つのレコードが含まれます。
次に、最後のクエリはWHERE句を適用して、ランキングシーケンスが4未満の場合のみを含めます(1つの質問に含まれる可能性のある9つの回答すべてのうち、最後の「ORDER BY」句を適用して質問をまとめますが、ランダム化します答えがあるため、「正しい」が常に最初の位置に返されるとは限りません。機能を確認するためだけに、テスト目的でこの外側の「ORDER BY」句を削除して、後で追加し直すことができます。
select
FinalQA.*
from
( select
QWithAllAnswers.*,
@RankSeq := if( @LastQuestion = QWithAllAnswers.id, @RankSeq +1, 1 ) ARankSeq,
@LastQuestion := QWithAllAnswers.id as ignoreIt
from
( SELECT
q.id,
q.question,
q.RandQuestionResult,
a.question_id,
a.answer,
a.correct
FROM
( SELECT q.ID,
q.Question,
q.question_ID,
RAND() as RandQuestionResult
FROM
questions q
WHERE
q.subject_id = 18
ORDER BY RAND()
LIMIT 5) JustQ
JOIN answers a
on q.id = a.question_id
ORDER BY
JustQ.RandQuestionResult,
if( a.correct = 1,0.000000, RAND()
) QWithAllAnswers,
( select @RankSeq := 0, @LastQuestion := 0 ) SQLVars
) FinalQA
where
FinalQA.ARankSeq < 5
order by
FinalQA.RandQuestionResult,
rand()
小さな変更をいくつか...SQLVars
で確認してください :=
があります 割り当てごとに。私が最初に投稿したとき、誤ったエラーをスローした可能性のある「:」を1つ残しました。また、「a.correct =1」(エイリアス参照がない)を使用して、内部の「Orderby」を修飾しました。最後に、外側のWHERE句を< 5
に変更しました <= 4
の代わりに 。私はこれらの最高のXperYグループの多くを実行しましたが、それらが機能することを知っていますが、確かに単純なものが欠けています。
また、IF()
を調整しました 最初の値を小数として持つランダム。最初の位置ですべての正解を取得するには、SQLVars
を適用します そのセットに対して、ランクの順序と順序を確定します。