2009-08-07 20 views
20

Ich möchte eine Auswahl in einer Tabelle vornehmen und die Ergebnisse nach einem bestimmten Schlüsselwort oder einer Liste von Schlüsselwörtern ordnen. Zum Beispiel habe ich eine Tabelle wie folgt:SQL-Reihenfolge Nach String-Liste?

ID Code 
1 Health 
2 Freeze 
3 Phone 
4 Phone 
5 Health 
6 Hot 

so, anstatt einfach ein einfaches Order By asc/desc ich order by Health, Phone, Freeze, Hot möchten. Ist das möglich?

+0

Warum ist Telefon zweimal dort? – pjp

Antwort

44

Versuchen Sie es mit dieser:

select * from table 
order by FIELD(Code, 'Health', 'Phone', 'Freeze', 'Hot') 
+3

Dies ist die richtige Lösung wie in der Dokumentation (Kommentare). Eine gute Erklärung finden Sie [hier] (http://www.electrictoolbox.com/mysql-order-specific-field-values/) – kapad

+1

Beachten Sie, dass die FIELD() - Funktion für MySQL spezifisch ist und auf anderen nicht funktioniert SQL-Datenbankserver – orrd

1

Ja Ihre Ergebnisse zu Ihrer Codetabelle beitreten und dann um durch code.CodeOrder

EDIT: Explaing die Verwendung der Code-Tabelle ...

Erstellen Sie eine separate Tabelle von Codes (CodeId, Code, CodeOrder) und treten Sie diesem bei und bestellen Sie durch CodeOrder. Das ist netter als die Bestellung durch (Fall ...) Hack vorgeschlagen, da Sie die Codes und die Bestellungen leicht ändern können.

+0

Ich denke, der Punkt ist, dass die gewünschte Reihenfolge nicht die Code- oder ID-Reihenfolge ist. – cletus

+0

Ich ging davon aus, dass eine Codetabelle zusammen mit der Code-ID und der Auftrags-ID existiert. – pjp

12

Sie können der Tabelle "Schlüsselwörter" beitreten und eine Sequenzspalte und ORDER BY Keyword.Sequence einschließen.

Beispiel Keyword-Tabelle sieht wie folgt aus:

ID Code  Sequence 
1 Health 1 
2 Freeze 3 
3 Phone 2 
4 Hot  4 

Dann können Sie mitmachen.

Hoffe, das gibt Ihnen die Idee.

3

Paar Optionen:

  1. Bestellcode Spalte mit numerischen gewünschten Reihenfolge

  2. dieser Tabelle ID eine Tabelle mit FK hinzufügen und order

10

ist hinzufügen Hier eine schreckliche Hack :

select * from table 
order by (
    case Code 
    when 'Health' then 0 
    when 'Phone' then 1 
    when 'Freeze' then 2 
    when 'Hot' then 3 
    end 
) 
+7

Ich stimme dem "horrious hack" -Teil zu ;-) –

+1

stimme ich auch zu :), und es funktioniert nur mit einer statischen Liste, wenn ein anderer Code irgendwann in der Zukunft hinzugefügt würde, müsste die Speicherprozedur als refaktoriert werden gut, um diese Änderung zu berücksichtigen. –

+0

Ja, es wäre ein Arsch zu pflegen und nicht so elegant wie ich es möchte, aber das ist, was ich tun muss. Ich schlug bereits eine – Tikeb

3

Ist das nur ein einmaliges ORDER BY oder etwas, das Sie oft und auf mehr Werte als hier angegeben tun wollen?

Die Reihenfolge, die Sie gegeben haben, ist willkürlich, also eine Kennung gegeben werden muss, um erreichen, was Sie

SELECT 
    ID, 
    Code, 
    CASE Code 
     WHEN 'Health' THEN 1 
     WHEN 'Phone' THEN 2 
     WHEN 'Freeze' THEN 3 
     WHEN 'Hot' THEN 4 
    END As OrderBy 
FROM Table 
ORDER BY 
    OrderBy 

Oder

SELECT 
    ID, 
    Code 
FROM Table 
ORDER BY 
    CASE Code 
     WHEN 'Health' THEN 1 
     WHEN 'Phone' THEN 2 
     WHEN 'Freeze' THEN 3 
     WHEN 'Hot' THEN 4 
    END 

(Ich bin nicht vertraut mit MySQL wollen, aber Das obige würde in SQL Server funktionieren. Die Syntax für MySQL wird nicht zu unterschiedlich sein)

Wenn Sie dies wahrscheinlich oft tun möchten Erstellen Sie dann eine OrderBy-Spalte in der Tabelle oder erstellen Sie eine OrderBy-Tabelle mit einem FK-Link zu dieser Tabelle, und geben Sie darin ein numerisches OrderBy-Feld an.

2

Hallo dies ist ein SQL Server-Abfrage, aber ich bin sicher, dass Sie dies in MySQL als auch tun können:

SELECT ID, Code 
FROM x 
ORDER BY 
    CASE Code WHEN 'Health' THEN 1 
       WHEN 'Phone' THEN 2 
       WHEN 'Freeze' THEN 4 
       WHEN 'Hot' THEN 5 
    ELSE 6 END ASC 
    , Code ASC 
4

Heute hat MySQL eine Funktion find_in_set() genannt

es wie folgt verwendet:

select * from table 
order by find_in_set(Code,'Health','Phone','Freeze','Hot') 
Verwandte Themen