Dans MySQL, comment définir un ordre de tri personnalisé.
Pour essayer d'expliquer ce que je veux, considérez 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 par ID croissant afin que Language = ENU vienne en premier, puis JPN et enfin DAN.
Le résultat doit être: a, d, b, e, c, f etc.
Est-ce seulement possible?
GROUP BY
avant? Par exemple, la première valeur que je veux, apparaît à la fin?GROUP BY
dans une sous-requête et laSi ce sont les trois seules valeurs, vous pouvez utiliser une
CASE
expression :(S'il peut y avoir d'autres valeurs, alors vous pouvez ajouter une logique supplémentaire pour garder l'ordre cohérent; par exemple, vous pouvez ajouter
ELSE 4
à cetteCASE
expression, puis commander parLanguage
lui-même comme troisième critère de classement:)
la source
Vous avez quelques options, la première est de changer la langue en ENUM (en supposant que cela soit possible, et vous ne vous attendez qu'à quelques variations)
Si vous le spécifiez comme
ENUM('ENU','JPN','DAN')
alorsORDER Language ASC
, l'ordre dans l'ordre que vous spécifiez.La seconde impliquera un cas quelque part, c'est-à-dire
En termes de performances, la méthode ENUM renverra 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 les langues, mais cela peut être excessif dans ce cas.
la source
ENUM('ENU','JPN','DAN')
?END DESC,
êtreEND CASE DESC,
?CASE
n'ont pas besoinEND CASE
, cela dépend du contexte.CASE
dans PROCEDURE requireEND CASE
( dev.mysql.com/doc/refman/5.5/en/case.html ) maisCASE
dans SELECT ne nécessite pasEND CASE
, simplementEND
( dev.mysql.com/doc/refman/5.7/en/… ) - dans ce contexte c'est une fonction de flux de contrôle.Pour le framework Yii2, nous pouvons réaliser de la manière suivante
la source