Логично не е възможно да направите това, което искате, ще се опитам да обясня, използвайки вашия избор на поръчка
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
е първо и кое е второ. Няма начин да решите как да направите това. Така че независимо от това, че базата данни не успява да я сортира по начина, по който искате. Без повече информация, за да направите този избор, няма начин да се конструира цикъл дори за сортиране на това. Най-доброто, което можете да направите, е да сортирате по първичния ключ и след това по нивото. Което най-вероятно ще трябва да направите от страната на сървъра.
Мисля, че грешката, която направихте тук, е, че трябва да използвате действителния уникален идентификатор на въпросите, ако имате ограничения за броя въпроси на всяко ниво, това трябва да се разгледа отделно.
Надяваме се, че това има смисъл.
Ако се опитвате да изберете x
брой произволни въпроси при n
ниво, което може да се изработи доста лесно. Например, ако искате
- 2 пъти въпроса на ниво 1
- 4 пъти въпроси на ниво 2
- 3x въпроса на ниво 3
- 1x въпроси на ниво 4.
Това може да се направи с четири прости заявки за нивото, като същевременно сортирате на случаен принцип в полето id и използвате подходяща лимитна клауза за това ниво. Между другото, това са номерата на нивата във вашия въпрос.
АКО искате да изберете произволни въпроси на дадено ниво, може да искате да го направите с подзаявка. 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 )
Въпреки че трябва да призная, че никога не съм опитвал това, просто имах идея.