Logicamente non è possibile fare quello che vuoi, cercherò di spiegarti usando la tua scelta d'ordine
ORDER BY FIELD(`question_level`, 1, 2, 1, 2, 3, 2, 4, 2, 3, 3)
Quindi qui vogliamo 1
quindi 2
quindi 1
di nuovo del question_level
. Ora nella tabella abbiamo questi valori. Mi occuperò solo di question_level #1, che è tutto ciò di cui ho bisogno per mostrare il mio punto.
id | question | question_level
______________________________________
1 | abc | 1
______________________________________
5 | qoindos | 1
______________________________________
Come puoi vedere abbiamo righe per question_level=1
Ora come farebbe il sistema a decidere quale livello 1
è il primo e quale è il secondo. Non c'è modo di decidere come farlo. Quindi, indipendentemente dal fatto che il database non riesca a ordinarlo nel modo desiderato. Senza ulteriori informazioni per fare quella scelta, non c'è modo di costruire un ciclo anche per ordinarlo. Il meglio che puoi fare è ordinare in base alla chiave primaria e quindi al livello. Cosa che dovresti fare molto probabilmente lato server.
Penso che l'errore che hai commesso qui sia che devi utilizzare l'ID univoco effettivo delle domande, se hai limiti sul numero di domande a ciascun livello, questo deve essere affrontato separatamente.
Speriamo che abbia senso.
Se stavi cercando di selezionare x
numero di domande casuali in n
livello che potrebbe essere risolto abbastanza facilmente. Ad esempio se volessi
- 2x domande al livello 1
- 4x domande al livello 2
- 3x domande al livello 3
- 1x domande al livello 4.
Questo potrebbe essere risolto con quattro semplici query per il livello, ordinando casualmente sul campo id e utilizzando una clausola limite appropriata per quel livello. A proposito, questi sono i numeri di livelli nella tua domanda.
SE vuoi selezionare domande casuali a un determinato livello, potresti volerlo fare con una sottoquery. RAND()
ha alcune penalità di prestazioni che dovresti essere in grado di aggirare semplicemente randomizzando la chiave primaria e quindi unendoti sul tavolo per estrarre il resto dei dati una volta ordinato. Ma dovresti confrontarlo.
Quindi un esempio sarebbe questo.
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 )
Anche se devo ammettere che non l'ho mai provato, solo un'idea che avevo.