2010-09-26 28 views
41

Mam coś jakMySQL Wybierz gdzie w podanej kolejności

SELECT * FROM table WHERE id IN (118,17,113,23,72); 

Gdybym tylko to zwraca wierszy w kolejności rosnącej ID zrobić. Czy istnieje sposób na odzyskanie wierszy w kolejności podanej w instrukcji IN?

Odpowiedz

77

Powinieneś użyć "ZAMÓW PRZEZ POLU". Na przykład:

SELECT * FROM table WHERE id IN (118,17,113,23,72) 
ORDER BY FIELD(id,118,17,113,23,72) 
+0

Dziękujemy! To działa! – kentor

+0

@kentor: bez problemu, cieszę się, że pomogło – nico

+1

Jak to jest z wydajnością? Czy jest powolny, gdy ponownie określić tę samą listę identyfikatorów? – Emerald214

11

Spróbuj użyć FIND_IN_SET:

SELECT * FROM table WHERE id IN (118,17,113,23,72) 
    ORDER BY FIND_IN_SET(id, '118,17,113,23,72'); 
+0

+1: To było moim zaleceniem –

+3

Jak "find_in_set" porównać do 'field'? – ShiningRay

+2

@ShiningRay Od instrukcji wydaje się, że 'FIELD' jest prostą metodą, a' FIND_IN_SET' jest bardziej rozbudowaną i złożoną wersją, która obejmuje parsowanie napisów i tworzenie 'SET'. – Igor

0

Jedną z opcji jest użycie UNION:

SELECT * FROM table WHERE id = 118 
UNION 
SELECT * FROM table WHERE id = 17 
UNION 
SELECT * FROM table WHERE id = 113 
... 
+0

Lub 'UNION WSZYSTKIE' jeśli otrzymujesz z powrotem wiersze, które mogą być duplikatami siebie nawzajem. W moim kodzie wydaje się, że może to być dość powolne. –

0

Można utworzyć wiele do sortowania na podstawie wartości ID:

select * 
from table 
where id in (118,17,113,23,72) 
order by 
    case id 
    when 118 then 1 
    when 17 then 2 
    when 133 then 3 
    when 23 then 4 
    when 72 then 5 
    end 
0

to jest pierwsza rzecz, która pojawia się w umyśle. uwaga sql jest niesprawdzone, może być konieczne w celu sprawdzenia poprawnej składni

jest trochę uciążliwe, ale może rade

select * from table where id = 118 
union 
select * from table where id = 17 
union 
.... and so on 
0

myślę, że jeśli zrobił UNION zapytanie ze sobą wybrać, może go zwrócić uszeregowane.

SELECT * FROM table WHERE id=118 
UNION 
SELECT * FROM table WHERE id=17 
... 

Brzydki, ale myślę, że zadziała.

2

Można utworzyć temp tabeli z dwoma kolumnami (ID, order_num):

ID order_num 
118 1 
17 2 
113 3 
23 4 
72 5 

następnie dołączyć:

SELECT * from table 
INNER JOIN #temp_table 
ON table.id = #temp_table.id 

zauważyć, że można spaść klauzuli IN.

Czasami faktycznie tworzę stały stół, ponieważ wtedy, gdy klient nieuchronnie zmienia zdanie na temat zamawiania, nie muszę dotykać kodu, tylko stołu.

Edit

Odpowiedź użyciu ORDER BY FIELD() (który nie wiedział o) jest prawdopodobnie to, co chcesz.

+1

+1 Za "nieunikniony" (i całkowicie prawdziwy) komentarz. – Julian