web-dev-qa-db-fra.com

Commande par valeur de champ spécifique en premier

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
66
Omid

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.

111
Nerdmaster

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.

87
juergen d

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

Démo: http://www.sqlfiddle.com/#!2/753ee/1

6
mellamokb

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
3
Icarus

Cela fonctionne pour moi avec Postgres 9+:

SELECT *
FROM your_table
ORDER BY name = 'core' DESC, priority DESC
3
Vojtech Vitek
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')
1
meiy arul

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
0
Madhuka Dilhan