sql >> Base de Datos >  >> RDS >> Mysql

recuperar el registro en orden con la cláusula IN - tener valores duplicados en la cláusula IN

Lógicamente no es posible hacer lo que quieres, intentaré explicarte usando tu elección de orden

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

Así que aquí queremos 1 entonces 2 entonces 1 de nuevo del question_level . Ahora en la tabla tenemos estos valores. Me ocuparé solo de question_level #1, que es todo lo que necesito para mostrar mi punto.

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

Como puede ver, tenemos filas para question_level=1 Ahora, ¿cómo decidiría el sistema qué nivel 1 es el primero y cual es el segundo. No hay manera de decidir cómo hacer esto. Entonces, independientemente de que la base de datos no lo ordene de la manera que desea. Sin más información para hacer esa elección, no hay forma de construir un bucle ni siquiera para ordenar eso. Lo mejor que podría hacer es ordenar por clave principal y luego por nivel. Lo que probablemente tendrías que hacer del lado del servidor.

Creo que el error que cometiste aquí es que debes usar la identificación única real de las preguntas, si tienes límites en la cantidad de preguntas en cada nivel, entonces eso debe abordarse por separado.

Esperemos que tenga sentido.

Si estuviera tratando de seleccionar x número de preguntas aleatorias en n nivel que podría resolverse con bastante facilidad. Por ejemplo, si quisiera

  • 2x preguntas en el nivel 1
  • 4 preguntas en el nivel 2
  • 3 preguntas en el nivel 3
  • 1x preguntas en el nivel 4.

Esto podría resolverse con cuatro consultas simples para el nivel, mientras se clasifica aleatoriamente en el campo de identificación y se usa una cláusula de límite adecuada para ese nivel. Por cierto, estos son los números de niveles en su pregunta.

SI desea seleccionar preguntas aleatorias en un nivel determinado, puede hacerlo con una subconsulta. RAND() tiene algunas penalizaciones de rendimiento que debería poder eludir simplemente aleatorizando la clave principal y luego uniéndose a la tabla para extraer el resto de los datos una vez que se ordene. Pero, deberías compararlo.

Así que un ejemplo de eso sería esto.

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 )

Aunque debo admitir que nunca probé esto, es solo una idea que tuve.