2010-11-07 13 views
6

Ich suche nach einer Bestellung in einer bestimmten Reihenfolge. Ich weiß, dass ich die gesamte Datenbank ändern kann, aber ich würde dann die gesamte Codebasis ändern müssen.MySQL Bestellung von Hilfe!

Was ich habe, ist eine Spalte in einer Tabelle 'Spiele' namens 'Status'.

So ...

SELECT * 
    FROM games 
ORDER BY status ASC -- Will retrieve results going from 0 then 1 then 2 

Was ich suche ist in der Lage sein, es zu bestellen um 1 dann 0, dann 2.

Irgendwelche Ideen ???

Antwort

4

Wenn ich richtig verstehe, ein mit CASE expression:

SELECT g.* 
    FROM GAMES g 
ORDER BY CASE g.status 
      WHEN 0 THEN 1 
      WHEN 1 THEN 2 
      WHEN 2 THEN 3 
     END 

Mit FIND_IN_SET function:

SELECT g.* 
    FROM GAMES g 
ORDER BY FIND_IN_SET(g.status, '0,1,2') 

Mit FIELD function:

SELECT g.* 
    FROM GAMES g 
ORDER BY FIELD(g.status, 0, 1, 2) 
+0

das wäre die richtige Antwort gewesen, aber das OP fragte nach Bestellung 1,0,2 – ajacian81

+0

@ ajacian81: Der Kommentar davor widerspricht, aber ich denke, die Konsistenz der Beispiele gibt genug von einer Idee, wie man nach Bedarf ändern . –

2

Sie können FIELD() verwenden:

SELECT * 
FROM games 
ORDER BY FIELD(status, 1, 0, 2) 

Aber es könnte besser sein, ein bisschen mehr zu erklären, was Sie tun wollen, das heißt, was Ihre Tabelle enthält.

+0

Dies ist die richtige Antwort. – ajacian81

0

Eine andere Möglichkeit wäre eine Validierungstabelle für die Statusspalte zu haben, genannt etwas wie VAL_GAME_STATUS. GAMES.STATUS wäre ein Fremdschlüssel zu VAL_GAME_STATUS sein und VAL_GAME_STATUS wie

aussehen migt
CREATE TABLE VAL_GAME_STATUS -- Oracle format - modify as needed for other DB 
    (STATUS  NUMBER PRIMARY KEY, 
    DESCRIPTION VARCHAR2(50) NOT NULL UNIQUE, 
    SORT_ORDER NUMBER NOT NULL UNIQUE); 

Vor diesem Hintergrund wird die Abfrage sortierten Ergebnisse von GAMES zu holen wird

SELECT g.* 
    FROM GAMES g 
INNER JOIN VAL_GAME_STATUS s 
    USING (STATUS) 
ORDER BY s.SORT_ORDER; 

Der Nachteil hierbei ist, dass Sie brauchen, um Machen Sie einen Join, um die Daten zu sortieren, aber es ist ein kleiner Treffer, da VAL_GAME_STATUS eine kleine Tabelle ist, die wahrscheinlich im Speicher gehalten werden kann. Der Vorteil ist, dass Sie die Sortierreihenfolge im laufenden Betrieb ändern können, ohne Ihren Code zu berühren. Das Hinzufügen neuer Statuswerte mit einer geeigneten Sortierreihenfolge ist ebenfalls problemlos möglich.

Teilen und genießen.