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

trait d'union dans MySQL order by clause

La réponse est dans la question :

Le mot clé ici est "expression" . Vous pouvez utiliser des expressions dans le ORDER BY clause.

ORDER BY -order_line_groups.sequence DESC

est une expression arithmétique et le "trait d'union" n'est pas un trait d'union mais un moins ; un opérateur mathématique moins unaire.

Comment ça marche ?

Concernant le résultat, cela fonctionne comme prévu :

  • Si le type de colonne order_line_groups.sequence est un type numérique ou un type de date et d'heure (ils sont également stockés en interne sous forme de nombres), le moins inverse l'ordre des lignes renvoyées. La clause est équivalente à

      ORDER BY order_line_groups.sequence ASC
    
  • Si le type de la colonne est un type chaîne puis MySQL tente de convertir les valeurs de la colonne en nombres (parce que la soustraction est une opération arithmétique et qu'elle n'est pas définie pour les chaînes). Lorsque MySQL convertit des chaînes en nombres, il s'arrête sur le premier caractère qui n'est pas un chiffre. Selon les données que vous stockez dans la colonne order_line_groups.sequence , plus ou moins de ses valeurs de chaîne seront converties en nombre 0 .

Concernant la vitesse, comme expliqué dans la page de documentation fournie dans la question MySQL ne peut pas utiliser les index pour résoudre le ORDER BY . Cela ralentit la requête.

Conclusion

Utilisation de ORDER BY -order_line_groups.sequence rend la requête lente. De plus, cela ne fournit pas un bon moyen de trier le jeu de résultats lorsque le type de colonne sequence est un type de chaîne.