2010-12-01 8 views
8

Ist es möglich, eine willkürliche Reihenfolge für eine MySQL SELECT-Anweisung angeben? Z. B.MySQL geben beliebige Reihenfolge von ID

SELECT * FROM table_name WHERE id IN (1, 3, 2, 9, 7) ORDER BY (1, 3, 2, 9, 7); 

Die Reihenfolge der direkt nach IN genannten Zahlen nicht Rolle zu spielen.

+0

@MattDiPasquale - Sie haben bereits eine Bestellung in '1,3,2,9,7', laden Sie einfach die Ergebnisse für' 1,2,3,9,7', und legen Sie sie in der Reihenfolge von '1 , 3,2,9,7'. Irgendeine bestimmte Programmiersprache? – ajreal

+0

Ich benutze WordPress, PHP. Ich möchte alles in MySQL machen, so dass ich keine Verarbeitung in PHP machen muss. – ma11hew28

+0

@MattDiPasquale - 'find_in_set' ist nicht schnell und nicht sehr optimiert. In PHP ist es schneller und optimiert. – ajreal

Antwort

11

FIND_IN_SET Funktion wird der Trick

SELECT * FROM table_name WHERE id IN (1, 3, 2, 9, 7) ORDER BY FIND_IN_SET(id, '1,3,2,9,7'); 

http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_find-in-set

EDIT: Beachten Sie die fehlende Leerzeichen im String-Argument der FIND_IN_SET Funktion.

+0

Hast du das getestet? Als ich es ausprobierte, bekam ich die Bestellung: 2, 3, 7, 9, 1, das ist falsch – ma11hew28

+0

entfernen Sie die Leerzeichen –

+0

Oh, schön! Danke, es hat funktioniert! – ma11hew28

0

Einfache Antwort:

Instrument Ihrer Daten mit einem anderen "ordering" int Feld und dann ORDER BY diesem Feld. Dies sollte die meiste Zeit alles sein, was notwendig ist. Ich habe das erfolgreich gemacht, wo Kunden bestimmte Produkte in eine Liste mit Funktionen blenden können, indem sie niedrige Werte wie -1 oder -99 in das Bestellfeld eingeben.

Complex Antwort:

Dies würde gelten, wenn Sie, dass eine Bestellung normalisieren wollen, und wenn vielleicht haben Sie ein anderes Feld als zweiten Faktor in der Größenordnung haben, das ist schon in der Haupttabelle. Dies würde auch hilfreich sein, wenn Sie jedem Bestellpunkt andere Informationen wie z. B. eine Notiz zuordnen. Oder wenn viele Tabellen diese willkürliche Reihenfolge implementieren und Sie diese Reihenfolge von einem Ort aus orchestrieren/ändern möchten.

Was würden Sie tun, ist die „willkürlich“, um in einer Tabelle platzieren Sie verbinden können und dann durch das Feld der Bestellung:

SELECT t.*, o.ordering 
FROM table_name AS t 
LEFT JOIN table_name_ordering AS o ON t.ordering_id = o.id 
ORDER BY o.ordering, t.other_field 
4

prüfen MySQL ORDER BY FIELD aus. Ich denke, es wird genau das tun, was du willst.

+0

Ist das schneller als FIND_IN_SET? Ich würde wetten, dass es keine String-Syntax wie FIND_IN_SET hat. Die Syntax, die ich glaube, ist: 'ORDER BY FIELD (id, 1,3,2,9,7)' – Ciantic

Verwandte Themen