3 votes

Comment ORDER BY fonctionne-t-il avec des expressions à valeur unique dans MySQL ?

J'ai un problème avec order by . Nous savons que si nous donnons un nombre entier dans l'ordre par alors il ordonne par l'index de la colonne. Lorsque je l'utilise de cette façon, chaque fois que j'exécute la requête, j'obtiens le même résultat, ce qui est correct.

Mais quand je fais de cette valeur le résultat d'une expression (je veux dire que j'utilise une expression qui toujours évalue à 1), alors j'obtiens 3 combinaisons possibles de résultats lorsque je l'exécute.

Ainsi, pour une même valeur qui est statique, même résultat ; mais pour une même valeur qui est une expression évaluée, résultats différents.

Vous trouverez ci-dessous l'exemple de requête auquel je fais référence :

SELECT SomeColumns, (rand()* 10) as rand
FROM TableName
ORDER BY (if ((rand in (1) ), 1,1))
LIMIT 0 , 6

La requête ci-dessus donne trois ensembles de résultats possibles.

1voto

Salman A Points 60620

Regardez le SELECT syntaxe de la déclaration ; ORDER BY est définie comme suit :

ORDER BY {col_name | expr | position}

Plus loin sur cette page, il est mentionné :

Les positions des colonnes sont des entiers et commencent par 1.

Le tri par position de colonne fonctionne comme prévu lorsqu'il est spécifié comme un nombre entier. littéral . Dans votre cas, ORDER BY (if ((rand in (1) ), 1,1)) est une expression, et non une position de colonne. Il fonctionne comme suit :

  • Le site rand est ajoutée à toutes les lignes qui contiennent des valeurs entre 0.0 et 9.9999...
  • L'expression if(rand in (1), 1, 1) est évalué pour chaque ligne comme suit :
    • La sous-expression rand in (1) renvoie presque toujours false car il y a des chances que la rand colonne étant exactement 1 sont très, très, très faibles
    • En fonction de l'expression précédente, le IF la condition évalue à 1 ou 1 (c'était peut-être une faute de frappe dans votre code)
    • L'expression entière est évaluée à 1 pour chaque ligne
  • Puisque l'expression dans ORDER BY la clause donne 1 pour chaque rangée, les rangées ne seront pas triées

1voto

Lightness Races in Orbit Points 122793

ORDER BY 's syntaxe est :

ORDER BY {col_name | expr | position} [ASC | DESC], ...

Bien que les éléments suivants semblent équivalents à l'œil humain :

ORDER BY 1
ORDER BY (if ((rand in (1) ), 1,1))

ils ne le sont pas.

  • La première trie par le 1 st les données de la colonne, car il s'agit d'un nombre entier avec une valeur 1 .

  • La seconde, bien qu'elle soit évaluée à 1 n'est pas un entier mais une expression et, en tant que tel, un différents Le mécanisme de tri est invoqué. Pour chaque ligne, l'expression 1 est évaluée et utilisée pour déterminer la position de la ligne ; comme votre expression ne fait en fait aucune référence aux données de la ligne, vos résultats seront totalement imprévisibles.

    Que vous obteniez l'"ordre naturel" de la table (c'est-à-dire l'ordre physique qui se trouve être présent sous les abstractions relationnelles) ou un ordre d'apparence aléatoire que le système de gestion de l'information (SGI) n'est pas en mesure de déterminer. ORDER BY créé, je ne pourrais pas le dire, mais ça n'a pas non plus d'importance.

En général, on écrit quelque chose comme ça pour une expression :

ORDER BY `col` % 6

... c'est-à-dire quelque chose qui fait référence à des données.

0voto

Nikson Kanti Paul Points 1768
ORDER BY (if ((rand in (1) ), 1,1))

il a ordonné votre ensemble de résultats sur la base de l'expression. pour la valeur dynamique, il a également réordonné sur la base de votre expression. order by expression

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X