論理的にはあなたが望むことをすることは不可能です、私はあなたの注文選択を使って説明しようとします
ORDER BY FIELD(`question_level`, 1, 2, 1, 2, 3, 2, 4, 2, 3, 3)
したがって、ここでは1
が必要です 次に2
次に1
再びquestion_level
。これでテーブルにこれらの値があります。自分の主張を示すために必要なのは、question_level#1だけです。
id | question | question_level
______________________________________
1 | abc | 1
______________________________________
5 | qoindos | 1
______________________________________
ご覧のとおり、question_level=1
の行があります では、システムはどのレベルの1
をどのように決定するのでしょうか。 が最初で、どちらが2番目です。これを行う方法を決定する方法はありません。したがって、データベースが希望どおりにソートできなかったとしても。その選択を行うためのより多くの情報がなければ、それをソートするためにさえループを構築する方法はありません。最善の方法は、主キー、次にレベルで並べ替えることです。サーバー側で行う必要がある可能性が最も高いのはどれですか。
ここでの間違いは、質問の実際の一意のIDを使用する必要があることだと思います。各レベルで質問の数に制限がある場合は、個別に対処する必要があります。
うまくいけば、それは理にかなっています。
x
を選択しようとした場合 n
でのランダムな質問の数 かなり簡単に解決できるレベル。たとえば、必要な場合
- レベル1で2回の質問
- レベル2で4回の質問
- レベル3で3回の質問
- レベル4で1回の質問。
これは、idフィールドでランダムに並べ替え、そのレベルに適切なlimit句を使用しながら、レベルの4つの単純なクエリで解決できます。ちなみに、これらはあなたの質問のレベル数です。
特定のレベルでランダムな質問を選択したい場合は、サブクエリを使用して選択することをお勧めします。 RAND()
いくつかのパフォーマンスペナルティがあります。これは、主キーをランダム化し、テーブルに参加して、注文後に残りのデータを引き出すだけで回避できるはずです。ただし、ベンチマークする必要があります。
その一例がこれです。
SELECT
q1.*
FROM
tbl_questions AS q1
JOIN
(
SELECT
id
FROM
tbl_questions
WHERE
question_level = 1
ORDER BY RAND() LIMIT 2
) AS q2 USING( id )
私はこれを試したことがないことを認めなければなりませんが、私が持っていたアイデアだけです。