J'ai une table avec 3 colonnes:
id | name | priority
--------------------
1 | core | 10
2 | core | 9
3 | other | 8
4 | board | 7
5 | board | 6
6 | core | 4
Je veux commander le jeu de résultats en utilisant priority
, mais d'abord les lignes qui ont name=core
même si la priorité est inférieure. Le résultat devrait ressembler à ceci
id | name | priority
--------------------
6 | core | 4
2 | core | 9
1 | core | 10
5 | board | 6
4 | board | 7
3 | other | 8
Il y a aussi la fonction MySQL FIELD
.
Si vous souhaitez effectuer un tri complet pour toutes les valeurs possibles:
SELECT id, name, priority
FROM mytable
ORDER BY FIELD(name, "core", "board", "other")
Si vous ne vous souciez que de ce "noyau" est le premier et les autres valeurs ne comptent pas:
SELECT id, name, priority
FROM mytable
ORDER BY FIELD(name, "core") DESC
Si vous souhaitez trier d'abord par "noyau", puis les autres champs dans l'ordre de tri normal:
SELECT id, name, priority
FROM mytable
ORDER BY FIELD(name, "core") DESC, priority
Il y a quelques mises en garde ici, cependant:
Premièrement, je suis à peu près sûr que c'est une fonctionnalité exclusivement mysql - la question est étiquetée mysql, mais on ne sait jamais.
Deuxièmement, faites attention à la manière dont FIELD()
fonctionne: il retourne l'index à base unique de la valeur - dans le cas de FIELD(priority, "core")
, il retournera 1 si "core" est la valeur. Si la valeur du champ ne figure pas dans la liste, il retourne zéro . C'est pourquoi DESC
est nécessaire sauf si vous spécifiez toutes les valeurs possibles.
Généralement tu peux faire
select * from your_table
order by case when name = 'core' then 1 else 2 end,
priority
Surtout dans MySQL, vous pouvez aussi faire
select * from your_table
order by name <> 'core',
priority
Comme le résultat d'une comparaison dans MySQL est soit 0
ou 1
et vous pouvez trier selon ce résultat.
Une façon de donner la préférence à des lignes spécifiques consiste à ajouter un grand nombre à leur priorité. Vous pouvez le faire avec une instruction CASE
:
select id, name, priority
from mytable
order by priority + CASE WHEN name='core' THEN 1000 ELSE 0 END desc
Une façon est la suivante:
select id, name, priority from table a
order by case when name='core' then -1 else priority end asc, priority asc
Cela fonctionne pour moi avec Postgres 9+:
SELECT *
FROM your_table
ORDER BY name = 'core' DESC, priority DESC
SELECT * FROM cars_new WHERE status = '1' and car_hide !='1' and cname IN ('Executive Car','Saloon','MPV+','MPV5') ORDER BY FIELD(cname, 'Executive Car', 'Saloon','MPV+','mpv5')
faire ceci:
SELECT * FROM table ORDER BY column `name`+0 ASC
Ajouter le +0 signifiera que:
0, 10, 11, 2, 3, 4
devient :
0, 2, 3, 4, 10, 11