Logikanya tidak mungkin untuk melakukan apa yang Anda inginkan, saya akan mencoba menjelaskan menggunakan pilihan pesanan Anda
ORDER BY FIELD(`question_level`, 1, 2, 1, 2, 3, 2, 4, 2, 3, 3)
Jadi di sini kita ingin 1
lalu 2
lalu 1
lagi dari question_level
. Sekarang di tabel Kami memiliki nilai-nilai ini. Saya akan menyibukkan diri hanya dengan question_level #1 yang saya butuhkan untuk menunjukkan maksud saya.
id | question | question_level
______________________________________
1 | abc | 1
______________________________________
5 | qoindos | 1
______________________________________
Seperti yang Anda lihat, kami memiliki baris untuk question_level=1
Sekarang bagaimana sistem memutuskan level mana 1
mana yang pertama dan mana yang kedua. Tidak ada cara untuk memutuskan bagaimana melakukan ini. Jadi terlepas dari Database yang gagal mengurutkannya seperti yang Anda inginkan. Tanpa lebih banyak informasi untuk membuat pilihan itu, tidak ada cara untuk membuat loop bahkan untuk mengurutkannya. Yang terbaik yang bisa Anda lakukan adalah mengurutkan berdasarkan kunci utama, dan kemudian levelnya. Yang kemungkinan besar harus Anda lakukan di sisi server.
Saya pikir kesalahan yang Anda buat di sini adalah, Anda perlu menggunakan ID unik pertanyaan yang sebenarnya, jika Anda memiliki batasan berapa banyak pertanyaan di setiap level maka itu perlu ditangani secara terpisah.
Semoga masuk akal.
Jika Anda mencoba memilih x
jumlah pertanyaan acak di n
tingkat yang bisa dikerjakan dengan cukup mudah. Misalnya jika Anda ingin
- 2x pertanyaan di lv 1
- 4x pertanyaan di lv 2
- 3x pertanyaan di lv 3
- 1x pertanyaan di lv 4.
Ini dapat diselesaikan dengan empat kueri sederhana untuk level tersebut, sambil menyortir secara acak pada bidang id dan menggunakan klausa batas yang sesuai untuk level tersebut. Omong-omong, ini adalah jumlah level dalam pertanyaan Anda.
JIKA Anda ingin memilih pertanyaan acak pada tingkat tertentu, Anda mungkin ingin melakukannya dengan subquery. RAND()
memiliki beberapa penalti kinerja yang harus dapat Anda abaikan hanya dengan mengacak kunci utama dan kemudian bergabung di atas meja untuk menarik sisa data keluar setelah dipesan. Tapi, Anda harus membandingkannya.
Jadi contohnya adalah ini.
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 )
Meskipun saya harus mengakui bahwa saya belum pernah mencoba ini, hanya sebuah Ide yang saya miliki.