2009-08-26 13 views
53

Mam tablicę PHP z numerami identyfikatorów. Te liczby są już uporządkowane.MySQL ORDER BY IN()

Teraz chciałbym uzyskać mój wynik za pomocą metody IN(), aby uzyskać wszystkie identyfikatory.

Jednak te identyfikatory należy zamawiać jak w metodzie IN.

Na przykład:

IN(4,7,3,8,9) 

powinien dać wynik takiego:

4 - Article 4 
7 - Article 7 
3 - Article 3 
8 - Article 8 
9 - Article 9 

jakieś sugestie? Może jest funkcja do tego?

Dzięki!

+0

Jakie są inne dane powiązane z tymi liczbami? To może nam dać wskazówkę, dlaczego chcesz w tej kolejności. – Randell

Odpowiedz

125

myślę, że może być szukasz funkcji FIELD - podczas gdy normalnie traktowane jako funkcji strun, to działa dobrze dla liczb, też!

ORDER BY FIELD(field_name, 3,2,5,7,8,1) 
+1

Dokładnie. Właśnie patrzyłem w książkę kucharską MySQL Paula Dubois i znalazłem: SELECT id, nazwa Z artykułów, gdzie id IN (7,4,21) ORDER BY FIELD (id, 7,4,21) Dzięki! –

+0

Ludzie, do diabła, jesteście szybcy. ;-) – deceze

+0

@Henk, ciesząc się, że ci pomogłeś, ale akceptacja z uprowadzenia jest naprawdę osobliwym wydarzeniem na SO - z jakiegokolwiek powodu nie zrobiłeś mi awansu? -) –

-3

Musisz podać prawidłową kolejność za pomocą instrukcji.

SELECT ID FROM myTable WHERE ID IN(1,2,3,4) ORDER BY ID 

Dlaczego chcesz, aby Twoje dane zostały uporządkowane w sposób nieuporządkowany, tak jak w twoim przykładzie?

Jeśli nie przeszkadza concatening długich zapytań, spróbuj w ten sposób:

SELECT ID FROM myTable WHERE ID=1 
UNION 
SELECT ID FROM myTable WHERE ID=3 
UNION 
SELECT ID FROM myTable WHERE ID=2 
+0

Dzięki. Ale to nie wystarczy: SELECT id, nazwa Z artykułów, gdzie id IN (7,4,21) ORDER BY id Powinien pokazać 7,4,21. Ale zamiast tego pokaże: 4,7,21 ... –

+2

Unia robi * nie * zamówienie gwarancyjne. – paxdiablo

+0

Właśnie dlatego mój drugi strzał da pożądany "porządek", ale nie jest najsłodszy. –

0

standard SQL nie zapewnia sposób to zrobić (MySQL może, ale ja wolę rozwiązania, które są neutralne sprzedawca tak ja może zmienić DBMS "w dowolnym momencie).

To jest coś, co powinieneś zrobić w przetwarzaniu końcowym po zestaw wyników jest zwracany. SQL może zwracać je tylko w kolejności określonej w klauzuli "order by" (lub w dowolnej kolejności, jeśli nie ma takiej klauzuli).

Inną możliwością (choć nie podoba mi się to, jestem zaszczycony mogąc dać ci wybór) jest wykonanie wielu podróży do bazy danych, po jednym dla każdego identyfikatora i przetworzenie ich w miarę ich pojawiania się:

select * from tbl where article_id = 4; 
// Process those. 
select * from tbl where article_id = 7; 
// Process those. 
: : : : : 
select * from tbl where article_id = 9; 
// Process those. 
+0

Możesz to zrobić w standardowym SQL używając 'CASE col WHEN * 1st-val * THEN 1 WHEN * 2nd-val * THEN 2 ... END' – derobert

+1

... nie, żebym polecił coś takiego! – derobert

8

Można użyć FIELD():

ORDER BY FIELD(id, 3,2,5,7,8,1) 

Zwraca indeks (opcja) STW w str1, str2, str3 ... listy. Zwraca 0, jeśli str nie zostanie znaleziony.

To trochę brzydki hack, więc naprawdę go używaj tylko wtedy, gdy nie masz innego wyjścia. Sortowanie danych wyjściowych w aplikacji może być lepsze.