2010-02-02 5 views
23

Ich wähle eine Reihe von Kontoaufzeichnungen aus einer großen Tabelle (Millionen von Zeilen) mit Integer-ID-Werten. Als Basis einer Abfrage, wie man in gewisser Weise bekommt. Was ich mache, erstellen wir eine große kommagetrennte Liste und übergeben diese als "in" -Klausel in die Abfrage. Im Moment ist das Ergebnis völlig ungeordnet. Was ich tun möchte, ist, die Ergebnisse in der Reihenfolge der Werte in der "in" -Klausel zurück zu bekommen.Sortieren nach Reihenfolge der Werte in einer SELECT-Anweisung "in" -Klausel in mysql

Ich nehme an, stattdessen muss ich eine temporäre Tabelle erstellen und stattdessen eine Verknüpfung erstellen, die ich vermeiden möchte, aber möglicherweise nicht kann.

Gedanken? Die Größe der Abfrage ist jetzt auf etwa 60k begrenzt, da wir versuchen, die Ausgabegröße zu begrenzen, aber sie könnte beliebig groß sein, was eine "In" -Abfrage sowieso aus einem praktischen Standpunkt ausschließen könnte, wenn nicht ein Physisches.

Vielen Dank im Voraus.

+0

ähnlich http://stackoverflow.com/questions/1869063/customised-ordering-in- sql –

Antwort

0

Wenn Ihre Abfrage 60K ist, ist das ein Zeichen, dass Sie es falsch machen.

Es gibt keine andere Möglichkeit, die Ergebnismenge zu ordnen als mit einer ORDER BY-Klausel. Sie könnten eine komplizierte CASE-Klausel in Ihrer Bestellung haben, indem Sie alle Elemente in Ihrer IN-Klausel erneut auflisten, aber dann lautet Ihre Suchanfrage wahrscheinlich 120 KB.

Ich weiß, dass Sie nicht wollen, aber Sie sollten die Werte in die IN-Klausel in einer Tabelle oder einer temporären Tabelle setzen und damit verbinden. Sie können auch eine SortOrder-Spalte in die temporäre Tabelle aufnehmen und damit sortieren. Datenbanken wie Joins. Auf diese Weise können Sie mit Ihrer Abfrage eine gute Leistung erzielen.

0

Ihre erste Abfrage verwendet sicher eine order by-Klausel. Sie können also einfach einen Join durchführen und die selbe Order by-Klausel verwenden.

Zum Beispiel, wenn dies Ihre erste Abfrage

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

Und das war Ihre zweite Abfrage

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

Combined

 
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 
4

Ein bisschen ein Trick sein würde .. ..

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; 

Beachten Sie, dass die Liste der IDs im find_in_set eine Zeichenfolge ist, daher wird sie zitiert. Beachten Sie auch, dass die Ergebnisse ohne DESC in REVERSE-Reihenfolge an die angegebene Liste zurückgegeben werden.

Verwandte Themen