Ordinare per valore di campo specifico per primo

Ho una tabella con 3 colonne:

id | name | priority -------------------- 1 | core | 10 2 | core | 9 3 | other | 8 4 | board | 7 5 | board | 6 6 | core | 4 

Voglio ordinare il set di risultati usando la priority ma prima quelle file che hanno name=core anche se hanno priorità più bassa. Il risultato dovrebbe essere simile a questo

 id | name | priority -------------------- 6 | core | 4 2 | core | 9 1 | core | 10 5 | board | 6 4 | board | 7 3 | other | 8 

C’è anche la funzione MySQL FIELD .

Se si desidera completare l’ordinamento per tutti i valori possibili:

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

Se ti interessa solo che “core” è il primo e gli altri valori non contano:

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

Se vuoi ordinare prima per “core”, e gli altri campi in ordine normale:

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

Ci sono alcuni avvertimenti qui, però:

In primo luogo, sono abbastanza sicuro che questa è solo funzionalità mysql – la domanda è taggata mysql, ma non si sa mai.

In secondo luogo, prestare attenzione a come FIELD() funziona: restituisce l’ indice a base univoca del valore – nel caso di FIELD(priority, "core") , restituirà 1 se “core” è il valore. Se il valore del campo non è nella lista, restituisce zero . Questo è il motivo per cui DESC è necessario se non si specificano tutti i valori possibili.

Generalmente puoi farlo

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

Soprattutto in MySQL puoi anche farlo

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

Poiché il risultato di una comparazione in MySQL è 0 o 1 ed è ansible ordinare in base a quel risultato.

Un modo per dare la preferenza a righe specifiche è aggiungere un numero elevato alla loro priorità. Puoi farlo con una dichiarazione CASE :

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

Demo: http://www.sqlfiddle.com/#!2/753ee/1

Un modo è questo:

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

Questo funziona per me con 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') 

Fai questo:

 SELECT * FROM table ORDER BY column `name`+0 ASC 

L’aggiunta di +0 significa che:

 0, 10, 11, 2, 3, 4 

diventa:

 0, 2, 3, 4, 10, 11