Obter registro em ordem com a cláusula IN – tendo valores duplicados na cláusula IN

Tenho perguntas da mesa como

id | question | question_level ______________________________________ 1 | abc | 1 ______________________________________ 2 | prs | 3 ______________________________________ 3 | oesl | 2 ______________________________________ 4 | ocsl | 3 ______________________________________ 5 | qoindos | 1 ______________________________________ 6 | xyz | 3 ______________________________________ 7 | mnlop | 2 ______________________________________ 8 | cllse | 2 ______________________________________ 9 | teuosn | 4 ______________________________________ 10 | ulcd | 2 ______________________________________ 

Eu quero selecionar 10 registros que irão combinar com nível de pergunta. Tenho ordem de nível no qual eu quero todos os registros conforme abaixo

 1,2,1,2,3,2,4,2,3,3 

A saída deve ser

 id | question | question_level ______________________________________ 1 | abc | 1 ______________________________________ 3 | oesl | 2 ______________________________________ 5 | qoindos | 1 ______________________________________ 7 | mnlop | 2 ______________________________________ 2 | prs | 3 ______________________________________ 8 | cllse | 2 ______________________________________ 9 | teuosn | 4 ______________________________________ 10 | ulcd | 2 ______________________________________ 4 | ocsl | 3 ______________________________________ 6 | xyz | 3 ______________________________________ 

Eu tentei soluções diferentes, mas não consegui obter resultados corretos experimentados com campo, find_in_set, mas sem sucesso. Referido [ Force MySQL para retornar duplicatas da cláusula WHERE IN sem usar o JOIN / UNION? mas apenas contagem e registro em ordem

Eu tentei abaixo das soluções

 SELECT question_level FROM `tbl_questions` WHERE `question_level` IN (1,2,1,2,3,2,4,2,3,3) ORDER BY FIELD(`question_level`, 1, 2, 1, 2, 3, 2, 4, 2, 3, 3) LIMIT 10 SELECT question_level FROM tbl_questions WHERE FIND_IN_SET(`question_level`,'1,2,1,2,3,2,4,2,3,3'); SELECT question_level,question_object_name,question_object_path,question_answer FROM tbl_questions e JOIN (SELECT 1 AS question_level UNION ALL SELECT 2 UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 2 UNION ALL SELECT 4 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 3 ) matches USING (question_level) LIMIT 10; 

Eu tentei com o loop foreach também, mas sempre obtendo o mesmo registro quando o nível de perguntas coincide com o valor

 $array = explode(',', '1,2,1,2,3,2,4,2,3,3') foreach ($array as $value) { SELECT question_level FROM tbl_questions WHERE question_level = $value; } 

Se não for possível no mysql, pode ser possível usar o php.

desde já, obrigado

    Logicamente, não é possível fazer o que quiser, tentarei explicar usando sua escolha de ordem

      ORDER BY FIELD(`question_level`, 1, 2, 1, 2, 3, 2, 4, 2, 3, 3) 

    Então, aqui, queremos 1 então, 2 e 1 novamente do question_level . Agora, na tabela, temos esses valores. Eu vou me preocupar com apenas question_level # 1, que é tudo o que preciso mostrar meu ponto.

     id | question | question_level ______________________________________ 1 | abc | 1 ______________________________________ 5 | qoindos | 1 ______________________________________ 

    Como você pode ver, temos linhas para question_level=1 Agora, como o sistema deve decidir qual nível 1 é o primeiro e qual é o segundo. Não há como decidir como fazer isso. Portanto, independentemente do database não conseguir classificá-lo da maneira que desejar. Sem mais informações para fazer essa escolha, não há como construir um loop mesmo 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 o lado do servidor mais provável.

    Acho que o erro que você cometeu aqui é que você precisa usar as questões de identificação única real, se você tiver limites sobre quantas perguntas em cada nível devem ser abordadas separadamente.

    Espero que isso faça sentido.

    Se você estivesse tentando selecionar x número de perguntas aleatórias em n nível que poderia ser elaborado com bastante facilidade. Por exemplo, se você quisesse

    • 2x perguntas no lv 1
    • 4x perguntas no lv 2
    • 3x perguntas no lv 3
    • 1x perguntas no lv 4.

    Isso poderia ser elaborado com quatro consultas simples para o nível, enquanto classificava aleatoriamente no campo id e usando uma cláusula limite apropriada para esse nível. Por sua vez, esses são os números de níveis em sua pergunta.

    Se você deseja 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 poder falhar ao simplesmente aleatorizar a chave primária e, em seguida, juntar-se à mesa para retirar o resto dos dados uma vez que foi encomendado. Mas, você deve compará-lo.

    Então, um exemplo disso seria esse.

     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 Idéia que tive.

    Eu resolvi isso usando php

     $sequence = "1,2,1,2,3,2,4,2,3,3"; $seq_arr = explode(',', $sequence); 

    Passo 1:

    Conjunto criado para armazenar todos os detalhes

     $questions = array(); // to store all questions $final_questions = array(); // tos store final questions in the sequence needed $level_1 = array(); // level 1 questions $level_2 = array(); // level 2 questions $level_3 = array(); // level 3 questions $level_4 = array(); // level 4 questions $level_5 = array(); // level 5 questions 

    Passo 2 :

    Selecione toda a matriz de Db e armazene em cada matriz de acordo com o nível de perguntas

     $this->db->select(*); $this->db->from(questions); $query = $this->db->get(); $result = $query->result_array(); for ($i=0; $i 

    Etapa 3 :

    Corresponde a sequência com toda a matriz e armazene na matriz final.

     foreach ($seq_arr as $key => $value) { if($value == 1) { for ($i=0; $i < count($difficulty_array) ; $i++) { if(isset($level_1[$i]) && !empty($level_1[$i])){ if(!in_array($level_1[$i], $final_questions)) { $final_questions[] = $level_1[$i]; break; } } } } if($value == 2) { for ($i=0; $i < count($difficulty_array) ; $i++) { if(isset($level_2[$i]) && !empty($level_2[$i])){ if(!in_array($level_2[$i], $final_questions)) { $final_questions[] = $level_2[$i]; break; } } } } if($value == 3) { for ($i=0; $i < count($difficulty_array) ; $i++) { if(isset($level_3[$i]) && !empty($level_3[$i])){ if(!in_array($level_3[$i], $final_questions)) { $final_questions[] = $level_3[$i]; break; } } } } if($value == 4) { for ($i=0; $i < count($difficulty_array) ; $i++) { if(isset($level_4[$i]) && !empty($level_4[$i])){ if(!in_array($level_4[$i], $final_questions)) { $final_questions[] = $level_4[$i]; break; } } } } if($value == 5) { for ($i=0; $i < count($difficulty_array) ; $i++) { if(isset($level_5[$i]) && !empty($level_5[$i])){ if(!in_array($level_5[$i], $final_questions)) { $final_questions[] = $level_5[$i]; break; } } } } } print_r($final_questions);