Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

buscar registro em ordem com cláusula IN - com valores duplicados na cláusula IN


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.