MySQL – ORDER BY valori all’interno di IN ()

Spero di ordinare gli elementi restituiti nella seguente query in base all’ordine di inserimento nella funzione IN () .

INGRESSO:

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

PRODUZIONE:

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

Qualche idea?

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

La funzione FIELD restituisce la posizione della prima stringa nell’elenco rimanente di stringhe.

Tuttavia, è molto meglio per le prestazioni avere una colonna indicizzata che rappresenta il tuo ordinamento e quindi ordinare per questa colonna.

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 verificato) 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 di quello che stai facendo, l’ho trovato un po ‘bizzarro, ma ho sempre avuto modo di funzionare dopo aver giocato un po’.

Prova qualcosa come

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

Può essere questo può aiutare qualcuno (p_CustomerId è passato in 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 elencherà i nomi degli account con account collegati in modo che i clienti vengano visualizzati in alto seguito da altri account in ordine alfabetico.

Hai bisogno di un’altra colonna (numerica) nella tabella, in cui si specifica l’ordinamento. La clausola IN 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 una fila di risultati non ordinati: 1 e 11 alternanti