これは、例ごとのTOP Xレコードの別の例です。すべての質問に対して、あなたは4つの回答が必要です。 LIMITは実際には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"(エイリアス参照を持たない)を使用して内部の "Order By"を修飾しました。最後に、外側のWHERE句を<= 4
の代わりに< 5
に変更しました。私はこれらの最大のYグループごとにたくさんのことをして、彼らが働いていることを知っています。
また、IF()
ランダムを最初の小数点以下の値に調整します。そうでない場合、すべての乱数は1(整数)に設定され、決して小数点以下になりません... ORDERINGが適用されるときの問題については、 - すべての質問と最初の位置にすべての正解を得るためにあらかじめソートされたAを質問した後、そのセットに対してSQLVars
を適用し、ランク順序と順序を確定します。
私はあなたの他の質問をしようとしましたが、実際の解決策を得ることはできませんでした。他の人が参考にしたいと思うように、私が得た限りです:http://www.sqlfiddle.com/#!2/34906/34。なんらかの理由で、 'answers'の内部クエリの' ORDER BY RAND() 'が機能しません。 – mellamokb
あなたはPHPでうまくいくでしょう。 MySQLには、Oracle/SQL Server/PostgreSQLで使用できる言語構造がありません。 – gbn
@gbn:特に質問ごとに最大9個の回答しかないので、私は同意します。すべての答えをPHPに取り込み、そこでランダム化を行うのと同じくらい簡単になります。 – mellamokb