Logisk set er det ikke muligt at gøre, hvad du vil, jeg vil prøve at forklare ved hjælp af dit ordrevalg
ORDER BY FIELD(`question_level`, 1, 2, 1, 2, 3, 2, 4, 2, 3, 3)
Så her vil vi have 1
derefter 2
derefter 1
igen af question_level
. Nu i tabellen har vi disse værdier. Jeg vil bekymre mig om spørgsmålsniveau #1, hvilket er alt, hvad jeg behøver for at vise min pointe.
id | question | question_level
______________________________________
1 | abc | 1
______________________________________
5 | qoindos | 1
______________________________________
Som du kan se, har vi rækker for question_level=1
Hvordan ville systemet nu beslutte hvilket niveau 1
er første og som er anden. Der er ingen måde at beslutte, hvordan man gør dette. Så uanset at databasen ikke sorterer den som du ønsker. Uden mere information til at træffe dette valg er der ingen måde at konstruere en løkke, selv for at sortere det. Det bedste du kan gøre er at sortere efter den primære nøgle og derefter niveauet. Hvilket du højst sandsynligt skal gøre på serversiden.
Jeg tror, at den fejl, du lavede her, er, at du skal bruge spørgsmålets faktiske unikke ID, hvis du har grænser for, hvor mange spørgsmål på hvert niveau, så skal det behandles separat.
Forhåbentlig giver det mening.
Hvis du prøvede at vælge x
antal tilfældige spørgsmål ved n
niveau, der kunne klares ret nemt. For eksempel hvis du ønskede
- 2x spørgsmål på lv 1
- 4x spørgsmål på lv 2
- 3x spørgsmål på lv 3
- 1x spørgsmål på lv 4.
Dette kunne løses med fire simple forespørgsler til niveauet, mens man sorterer tilfældigt på id-feltet og bruger en passende grænsesætning for det pågældende niveau. Disse er i øvrigt antallet af niveauer i dit spørgsmål.
HVIS du ønsker at vælge tilfældige spørgsmål på et givet niveau, kan du gøre det med en underforespørgsel. RAND()
har nogle præstationsstraffe, som du burde være i stand til at omgå ved blot at randomisere den primære nøgle og derefter slutte sig til bordet for at trække resten af dataene ud, når de er bestilt. Men du bør benchmarke det.
Så et eksempel på det ville være dette.
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 )
Selvom jeg må indrømme, at jeg aldrig har prøvet dette, bare en idé, jeg havde.