2012-04-15 2 views
1

Ich habe diese Bestellung-durch Problem, das ich nicht knacken kann. Ich wähle aus meiner Tabelle wie folgt aus:mysql order-by original "wo bestellen"

SELECT * FROM 'sidemodules' WHERE name = 'module1' OR name = 'module2' OR 'name3' 

Welche gibt mir die Module ich will. Aber die Module der Tabelle liegen, sagen in dieser Reihenfolge:

  1. module3
  2. module1
  3. module2

Und sie sind in dieser Reihenfolge zu mir zurückgekehrt. Wie kann ich sie in der Reihenfolge AS IN THE WHERE CLAUSE (1,2,3) anzeigen lassen?

Vielen Dank!

Antwort

2

Ich glaube, Sie suchen FIELD:

SELECT * FROM sidemodules 
WHERE name IN ('module1', 'module2', 'name3') 
ORDER BY FIELD(name, 'module1', 'module2', 'name3') 

Wie auch immer, wenn die Namen in alphabetischer Reihenfolge sind benutzen Sie einfach:

ORDER BY name 

Beachten Sie auch, dass die IN-Operator ist in der Regel schneller als nur mit vielen OR s.

+0

Vielen Dank für Ihre Antwort, es war sehr nützlich! Die Codigniter-Implementierung, falls jemand interessiert ist, kann hier gefunden werden: [link] (http://www.simonemms.com/2011/04/07/codeigniter-activerecord-order-by-field/) –

0

Ich denke, Sie haben einen Tippfehler in Ihrer Frage. Ihre letzte Bedingung name = 'module3' statt nur name3

Bitte versuchen Sie Folgendes sein sollte:

SELECT * 
FROM 'sidemodules' 
WHERE name = 'module1' OR name = 'module2' OR name = 'module3' 
ORDER BY name; 
+0

Nein, Code ist in Ordnung , meine Post war schlampig: S;) –

0

Wenn Sie eine feste Reihenfolge Sie mit einer CASE-Anweisung bestellen:

SELECT * FROM 'sidemodules' 
WHERE name = 'module1' 
    OR name = 'module2' 
    OR name = 'module3' 
ORDER BY CASE 
    WHEN name = 'module1' THEN 1 
    WHEN name = 'module3' THEN 2 
    WHEN name = 'module2' THEN 3 
ELSE '0' 
END 
1

Sie müssen Verwenden Sie FIELD in der by by-Klausel. returnset wird in derselben Reihenfolge wie du schreibst.

SELECT * FROM sidemodules 
WHERE name IN ('module1', 'module2', 'name3') 
ORDER BY FIELD(name, 'module1', 'module2', 'name3') 

Ergebnis: module1, module2, name3

SELECT * FROM sidemodules 
WHERE name IN ('module1', 'module2', 'name3') 
ORDER BY FIELD(name, 'module2', 'module1', 'name3') 

Ergebnis: module2, module1, name3

+0

Vielen Dank für Ihre Antwort. –