Comment définir un ordre personnalisé par ordre dans mySQL

Dans MySQL comment définir un ordre de tri personnalisé.

Pour essayer d'expliquer ce que je veux considérer ce tableau:

ID  Language    Text
0   ENU         a
0   JPN         b
0   DAN         c       
1   ENU         d
1   JPN         e
1   DAN         f
2   etc...

Ici, je veux retourner toutes les lignes triées par langue et Id croissant afin que Language = ENU Vienne en premier, puis JPN et enfin DAN.

Le résultat devrait être: a, d,b,e,c, F etc.

Est-ce même possible?

100
demandé sur Zbynek 2012-02-21 17:42:00

3 réponses

MySQL a une fonction pratique appelée FIELD() ce qui est excellent pour des tâches comme celle-ci.

ORDER BY FIELD(Language,'ENU','JPN','DAN'), ID

Notez cependant que

  1. Cela rend votre SQL moins portable, car d'autres SGBD peuvent ne pas avoir une telle fonction

  2. Lorsque votre liste de langues (ou d'autres valeurs à trier) devient beaucoup plus longue, il est préférable d'avoir une table séparée avec une colonne sortorder pour eux, et de la joindre à vos requêtes pour la commande.

217
répondu Mchl 2013-08-01 06:26:50

Si ce sont les trois seules valeurs, alors vous pouvez utiliser a CASE expression :

ORDER BY `ID`,
         CASE `Language`
         WHEN 'ENU' THEN 1
         WHEN 'JPN' THEN 2
         WHEN 'DAN' THEN 3
         END

(S'il peut y avoir d'autres valeurs, vous pouvez ajouter une logique supplémentaire pour garder l'ordre cohérent; par exemple, vous pouvez ajouter ELSE 4 à cette expression CASE, puis Trier par Language lui - même comme troisième critère d'ordre:

ORDER BY `ID`,
         CASE `Language`
         WHEN 'ENU' THEN 1
         WHEN 'JPN' THEN 2
         WHEN 'DAN' THEN 3
         ELSE 4
         END,
         `Language`
)
38
répondu ruakh 2018-02-07 23:12:28

Vous avez quelques options désinvoltes, la première est de changer de langue pour être ENUM (en supposant que cela est possible, et vous n'attendez que quelques variations)

Si vous le spécifiez comme ENUM('ENU','JPN','DAN') alors {[2] } ordonnera dans l'ordre que vous spécifiez.

La seconde impliquera un cas quelque part, c'est-à-dire

SELECT * FROM table
ORDER BY CASE Language
    WHEN 'ENU' THEN 3
    WHEN 'JPN' THEN 2
    WHEN 'DAN' THEN 1
    ELSE 0
END DESC, ID ASC

En termes de performances, la méthode ENUM retournera des résultats plus rapides, mais sera plus compliquée si vous avez besoin d'ajouter plus de langues. Une troisième option serait d'ajouter une table de normalisation pour le Langues cependant qui peuvent être exagérées dans ce cas.

14
répondu Simon at mso.net 2016-12-20 09:57:31