Logicamente não é possível fazer o que você quer, vou tentar explicar usando sua escolha de pedido
ORDER BY FIELD(`question_level`, 1, 2, 1, 2, 3, 2, 4, 2, 3, 3)
Então aqui queremos
1
então 2
então 1
novamente do question_level
. Agora na tabela temos esses valores. Vou me preocupar apenas com o question_level #1, que é tudo o que preciso para mostrar meu ponto de vista. id | question | question_level
______________________________________
1 | abc | 1
______________________________________
5 | qoindos | 1
______________________________________
Como você pode ver, temos linhas para
question_level=1
Agora, como o sistema decidiria qual nível 1
é o primeiro e qual é o segundo. Não há como decidir como fazer isso. Portanto, independentemente do Banco de Dados não conseguir classificá-lo da maneira que você deseja. Sem mais informações para fazer essa escolha, não há como construir um loop nem para classificar isso. O melhor que você pode fazer é classificar pela chave primária e depois pelo nível. O que você teria que fazer no lado do servidor mais provavelmente. Acho que o erro que você cometeu aqui é que você precisa usar o ID exclusivo real das perguntas, se você tiver limites de quantas perguntas em cada nível, isso precisa ser abordado separadamente.
Espero que isso faça sentido.
Se você estava tentando selecionar
x
número de perguntas aleatórias em n
nível que poderia ser trabalhado com bastante facilidade. Por exemplo, se você quisesse - Duas perguntas no nível 1
- 4x perguntas no nível 2
- 3x perguntas no nível 3
- 1x perguntas no nível 4.
Isso pode ser resolvido com quatro consultas simples para o nível, enquanto ordena aleatoriamente no campo id e usando uma cláusula de limite apropriada para esse nível. A propósito, esses são os números de níveis em sua pergunta.
SE você quiser selecionar perguntas aleatórias em um determinado nível, você pode querer fazê-lo com uma subconsulta.
RAND()
tem algumas penalidades de desempenho que você deve ser capaz de contornar apenas randomizando a chave primária e, em seguida, juntando-se à tabela para extrair o restante dos dados uma vez ordenados. Mas, você deve fazer o benchmarking. Então, um exemplo disso seria isso.
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 )
Embora eu tenha que admitir que nunca tentei isso apenas uma ideia que tive.