MySQL - ORDER BY valori all'interno IN ()
-
12-09-2019 - |
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?
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