Domanda

Spero di ordinare gli elementi restituiti nella query seguente da l'ordine in cui vengono immesse nella funzione IN () .

INPUT:

SELECT id, name FROM mytable WHERE name IN ('B', 'A', 'D', 'E', 'C');

USCITA:

|   id   |   name  |
^--------^---------^
|   5    |   B     |
|   6    |   B     |
|   1    |   D     |
|   15   |   E     |
|   17   |   E     |
|   9    |   C     |
|   18   |   C     |

Tutte le idee?

È stato utile?

Soluzione

SELECT id, name
FROM mytable
WHERE name IN ('B', 'A', 'D', 'E', 'C')
ORDER BY FIELD(name, 'B', 'A', 'D', 'E', 'C')

Il funzione restituisce la posizione della prima stringa nella lista restante di stringhe.

Tuttavia, è molto meglio delle prestazioni-saggio avere una colonna indicizzata che rappresenta il vostro ordinamento, e quindi ordinare da questa colonna.

Altri suggerimenti

Un'altra opzione da qui: http://dev.mysql.com/doc/refman/5.0 /en/sorting-rows.html

select * 
from tablename 
order by priority='High' DESC, priority='Medium' DESC, priority='Low" DESC;

Quindi nel tuo caso (non testato) sarebbe

SELECT id, name
FROM mytable
WHERE name IN ('B', 'A', 'D', 'E', 'C')
ORDER BY name = 'B', name = 'A', name = 'D', name =  'E', name = 'C';

A seconda quello che stai facendo ho trovato un po 'eccentrico, ma sempre preso a lavorare dopo aver giocato con un po'.

Provare qualcosa di simile

... ORDER BY (CASE NAME WHEN 'B' THEN 0 WHEN 'A' THEN 1 WHEN ...

Può essere questo può aiutare qualcuno (p_CustomerId viene passato SP):

SELECT CompanyAccountId, CompanyName
FROM account
LEFT JOIN customer where CompanyAccountId = customer.AccountId
GROUP BY CompanyAccountId
ORDER BY CASE WHEN CompanyAccountId IN (SELECT AccountId 
                                          FROM customer
                                          WHERE customerid= p_CustomerId) 
                 THEN 0
                 ELSE 1
          END, CompanyName;

Descrizione: Voglio mostrare l'elenco degli account. Qui sto passando un ID cliente in sp. Ora verranno mostrati i nomi di account con account collegati a che i clienti sono mostrati in alto seguita da altri conti in ordine alfabetico.

È necessario un'altra colonna (numerico) nella tabella, in cui si specifica il tipo di ordinamento. La clausola non funziona in questo modo.

B - 1
A - 2
D - 3
E - 4
C - 5

basta usare

order by INSTR( ',B,C,D,A,' ,  concat(',' , `field`, ',' ) )

evitare la situazione come

 INSTR('1,2,3,11' ,`field`) 

terminerà con ordinata riga del risultato: 1 e 11 alternant

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top