Mysql
 sql >> Base de données >  >> RDS >> Mysql

récupérer l'enregistrement dans l'ordre avec la clause IN - avoir des valeurs en double dans la clause IN

En toute logique, il n'est pas possible de faire ce que vous voulez, je vais essayer d'expliquer en utilisant votre choix de commande

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

Donc ici nous voulons 1 puis 2 puis 1 à nouveau du question_level . Maintenant, dans le tableau Nous avons ces valeurs. Je vais m'occuper uniquement de question_level #1 qui est tout ce dont j'ai besoin pour montrer mon point de vue.

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

Comme vous pouvez le voir, nous avons des lignes pour question_level=1 Maintenant, comment le système déciderait-il quel niveau 1 est le premier et lequel est le second. Il n'y a aucun moyen de décider comment faire cela. Ainsi, quelle que soit la base de données qui ne parvient pas à la trier comme vous le souhaitez. Sans plus d'informations pour faire ce choix, il n'y a aucun moyen de construire une boucle, même pour trier cela. Le mieux que vous puissiez faire est de trier par clé primaire, puis par niveau. Ce que vous auriez probablement à faire côté serveur.

Je pense que l'erreur que vous avez commise ici est que vous devez utiliser l'identifiant unique réel des questions, si vous avez des limites sur le nombre de questions à chaque niveau, cela doit être traité séparément.

J'espère que cela a du sens.

Si vous essayez de sélectionner x nombre de questions aléatoires à n niveau qui pourrait être calculé assez facilement. Par exemple si vous vouliez

  • 2x questions au niveau 1
  • 4x questions au niveau 2
  • 3x questions au niveau 3
  • 1x questions au niveau 4.

Cela pourrait être résolu avec quatre requêtes simples pour le niveau, tout en triant de manière aléatoire sur le champ id et en utilisant une clause de limite appropriée pour ce niveau. En passant, ce sont les nombres de niveaux dans votre question.

SI vous souhaitez sélectionner des questions aléatoires à un niveau donné, vous pouvez le faire avec une sous-requête. RAND() a des pénalités de performance que vous devriez pouvoir contourner en randomisant simplement la clé primaire, puis en vous joignant à la table pour extraire le reste des données une fois qu'elles sont commandées. Mais, vous devriez le comparer.

Donc, un exemple de cela serait ceci.

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 )

Même si je dois admettre que je n'ai jamais essayé, c'est juste une idée que j'ai eue.