Ordinare prima in base al valore del campo specifico


91

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 priorityma prima quelle righe che hanno name=coreanche se hanno priorità inferiore. 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

Risposte:


159

C'è anche la funzione MySQLFIELD .

Se desideri un ordinamento completo per tutti i valori possibili:

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

Se ti interessa solo che "core" sia il primo e gli altri valori non contano:

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

Se desideri ordinare prima per "core" e gli altri campi nel normale ordinamento:

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

Ci sono alcuni avvertimenti qui, però:

Innanzitutto, sono abbastanza sicuro che questa sia una funzionalità solo mysql: la domanda è contrassegnata come mysql, ma non si sa mai.

Secondo, prestare attenzione a come FIELD()funziona: restituisce l' indice a base uno del valore - nel caso di FIELD(priority, "core"), restituirà 1 se "core" è il valore. Se il valore del campo non è nell'elenco, restituisce zero . Questo è il motivo per cui DESCè necessario a meno che non si specifichino tutti i valori possibili.


5
Dopo circa 5 anni ho cambiato la risposta accettata a questa perché è più pulita e più veloce.
Omid

equivalente db2?
Cybermonk

Ha funzionato per me, vorrei porre un'altra domanda su come gestire Se la colonna "priorità" contiene valori come es: "nucleo della terra", "nuova scheda" ecc. Qui la colonna non contiene un valore esatto, possiamo scrivere qualcosa di simile %nucleo%?
Jayanth Suvarna,

@JayanthSuvarna: guardando i documenti di MySQL FIELD (), sono abbastanza sicuro che non ci sia alcun modo per valutarli come sottostringhe, poiché ogni argomento deve essere una sorta di stringa. Potrebbero esserci alcune funzioni di manipolazione delle stringhe che potrebbero aiutare, ma non ne sono sicuro.
Nerdmaster

Grazie compagno. Hai reso la mia giornata.
BEingprabhU

92

In genere 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 un confronto in MySQL è 0o 1e puoi ordinare in base a quel risultato.


1
cosa significa 1e cosa 2significa qui?
Niraj Chauhan

1
Ho circa 3000 righe da ordinare. Nel mio caso la soluzione di @ Ayman-Hourieh su stackoverflow.com/questions/958627/... prende la metà del tempo rispetto a questa soluzione.
nightlyop

@nightlyop: bravo. Solo una nota: la soluzione più veloce è specifica per MySQL.
juergen d

1e 2sono solo 2 numeri che uso per ordinare i dati. Potrebbe essere 3e 4o qualcos'altro.
juergen d

E quando c'è %nella WHEREclausola? Come . . . WHERE name LIKE '%sth%' . . .? stackoverflow.com/questions/41303379/…
impila il

6

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

  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


5

Questo funziona per me usando Postgres 9+:

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

Ti va di spiegare -1? Errore + versione Postgres?
Vojtech Vitek

3

Un modo è questo:

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

1
Questo non perderà l'ordine delle corerighe?
mellamokb

1
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')

3
Sebbene il tuo codice possa essere la risposta alla domanda, è meglio fornire alcune spiegazioni al riguardo.
Mehraban

0

Fai questo:

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

Aggiungere il +0 significherà che:

0, 10, 11, 2, 3, 4

diventa:

0, 2, 3, 4, 10, 11

Questa tecnica serve per trasformare una stringa in un numero. Non risponde alla domanda del PO. (Tuttavia, senza vedere il tipo di dati di priority, non posso dire se dovrebbe far parte della soluzione completa.)
Rick James,

0

Usa questo:

SELECT * 
FROM tablename 
ORDER BY priority desc, FIELD(name, "core")
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.