134 votes

Classement par valeur de champ spécifique en premier

J'ai un tableau 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 ordonner l'ensemble des résultats en utilisant priority mais d'abord les rangs qui ont name=core même s'ils sont moins prioritaires. 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

230voto

Nerdmaster Points 516

Il y a aussi le MySQL FIELD fonction .

Si vous voulez 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 du "noyau dur" et que les autres valeurs n'ont pas d'importance :

SELECT id, name, priority
FROM mytable
ORDER BY FIELD(name, "core") DESC

Si vous voulez trier d'abord par "core", et 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 cependant quelques réserves à faire :

Tout d'abord, je suis presque sûr que cette fonctionnalité est réservée à mysql - la question est étiquetée mysql, mais on ne sait jamais.

Deuxièmement, faites attention à la façon dont FIELD() fonctionne : il renvoie le indice unique de la valeur - dans le cas de FIELD(priority, "core") il retournera 1 si la valeur est "core". Si la valeur du champ n'est pas dans la liste, il retourne zéro . C'est pourquoi DESC est nécessaire, sauf si vous spécifiez toutes les valeurs possibles.

103voto

juergen d Points 85039

En général, vous pouvez faire

select * from your_table
order by case when name = 'core' then 1 else 2 end,
         priority 

En particulier dans MySQL, vous pouvez aussi faire

select * from your_table
order by name <> 'core',
         priority 

Puisque le résultat d'une comparaison dans MySQL est soit 0 ou 1 et vous pouvez trier par ce résultat.

6voto

mellamokb Points 34067

Une façon de donner la préférence à des lignes spécifiques est d'ajouter un grand nombre à leur priorité. Vous pouvez le faire avec un CASE déclaration :

  select id, name, priority
    from mytable
order by priority + CASE WHEN name='core' THEN 1000 ELSE 0 END desc

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

6voto

Vojtech Vitek Points 1465

Cela fonctionne pour moi avec Postgres 9+ :

SELECT *
FROM your_table
ORDER BY name = 'core' DESC, priority DESC

3voto

Icarus Points 36951

Une façon de le faire est la suivante :

select id, name, priority from table a
order by case when name='core' then -1 else priority end asc, priority asc

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X