Sortuj według kolejności wartości w klauzuli select "in" w mysql

Wybieram zestaw rekordów konta z dużej tabeli (miliony wierszy) z wartościami integer id. Jako podstawowe zapytanie, w pewnym sensie. To, co robię, budujemy dużą listę rozdzieloną przecinkami i przekazujemy ją do zapytania jako klauzulę "in". W tej chwili wynik jest całkowicie nieuporządkowany. To, co chciałbym zrobić, to uzyskać wyniki w kolejności wartości w klauzuli "in".

Zakładam, że zamiast tego będę musiał zbudować tymczasową tabelę i zrobić join, który Chciałbym uniknąć, ale mogę nie być w stanie.

Myśli? Rozmiar zapytania w tej chwili jest ograniczony do około 60K każdy, ponieważ staramy się ograniczyć rozmiar wyjściowy, ale może być arbitralnie duży, co może wykluczyć zapytanie "w" i tak z praktycznego punktu widzenia, jeśli nie fizycznego.

Z góry dzięki.

Author: Kevin Galligan, 2010-02-02

4 answers

Właściwie to jest lepiej:

SELECT * FROM your_table
WHERE id IN (5,2,6,8,12,1)
ORDER BY FIELD(id,5,2,6,8,12,1);

Oto dokumentacja pola:

Http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_field

 43
Author: Dal Hundal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-03 12:22:51

Mała sztuczka....

SELECT * FROM your_table
WHERE id IN (5,2,6,8,12,1)
ORDER BY FIND_IN_SET(id,'5,2,6,8,12,1') DESC;

Zauważ, że lista ID w find_in_set jest ciągiem znaków, więc jest cytowana. Zauważ również, że bez DESC, wyniki są zwracane w odwrotnej kolejności, zgodnie z podaną listą.

 4
Author: Dal Hundal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-03 12:19:47

Jeśli Twoje zapytanie wynosi 60K, jest to znak, że robisz to w niewłaściwy sposób.

Nie ma innego sposobu, aby zamówić zestaw wyników niż za pomocą klauzuli ORDER BY. Możesz mieć skomplikowaną klauzulę CASE w swoim zamówieniu, wymieniając ponownie wszystkie elementy w klauzuli IN, ale wtedy twoje zapytanie prawdopodobnie wyniosłoby 120K.

Wiem, że nie chcesz, ale powinieneś umieścić wartości w klauzuli IN w tabeli lub tabeli tymczasowej i dołączyć do niej. Możesz również dołączyć kolumnę sortowania w tymczasowa tabela i kolejność według tego. Bazy danych jak joins. Robi to w ten sposób pomoże Twoje zapytanie wykonać dobrze.

 0
Author: Mark Byers,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-02 15:17:10

You ' re first query na pewno używa klauzuli order by. Możesz więc po prostu dołączyć i użyć tej samej klauzuli order by.

Na przykład, jeśli było to twoje pierwsze zapytanie

SELECT customer_id
  FROM customer  
 WHERE customer_id BETWEEN 1 AND 100 
ORDER
    BY last_name

I to było twoje drugie zapytanie

SELECT inventory_id
  FROM rental
 WHERE customer_id in (...the ordered list...)

Razem byłoby

SELECT r.inventory_id
  FROM rental r
INNER
  JOIN customer c
    ON r.customer_id = c.customer_id    
 WHERE c.customer_id BETWEEN 1 AND 100 
ORDER
    BY c.last_name
 0
Author: goat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-02 18:52:31