2017-10-01 6 views
1

Ich habe eine Tabelle, in der ich drei Felder mit dem Datentyp INT, INT und INT habe.Sortieren nach mehreren Spalten MySQL

Ich möchte meine Select-Abfrage mit all diesen drei Spalten sortieren. Sortieren nach ASC wenn Feld A < = 10, sortiert nach DESC field2 und sortieren nach ASC Feld irgendeinem Grund 3.

SELECT * FROM table1 WHERE id=uid  
ORDER BY 
    CASE table1.field1 
     WHEN table1.field1 < 11 THEN table1.field1 
     END 
    ASC, 
table1.field2 DESC, 
table1.field3 ASC; 

+------+--------+---------+ 
|field1| field2 | field3 | 
+------+--------+---------+ 
| 1 | 4 | 1 | 
+------+--------+---------+ 
| 2 | 3 | 2 | 
+------+--------+---------+ 
| 9 | 2 | 4 | 
+------+--------+---------+ 
| 10 | 1 | 7 | 
+------+--------+---------+ 

Für die CASE tut wirklich funktionieren, wenn ich ausschließen, dass es funktioniert, aber tut Art alle field1 in ASC bestellen, während ich nur die 10 zuerst möchte.

Antwort

2

Es besteht keine Notwendigkeit für table1.field1 ist vor WHEN:

SELECT * 
FROM table1 
WHERE id = uid  
ORDER BY CASE WHEN table1.field1 < 11 THEN table1.field1 END ASC, 
    table1.field2 DESC, 
    table1.field3 ASC; 

Erläuterung:

CASE table1.field1 
    WHEN table1.field1 < 11 THEN table1.field1 
END  -- this evaluates to true/false (1 and 0) 

=> 
CASE table1.field1 WHEN 1 THEN table1.field1 END 
+0

Während die Reihenfolge aus irgendeinem Grund jetzt korrekt ist, werden diese 10 Zeilen, bestellt als sein sollte , aber scheinen die letzten 10 Reihen zu sein, die ich anstelle der Top 10 bekomme. –

+0

@JohnJames 'während ich nur die 10 zuerst will. Es sieht aus, als ob du' LIMIT 10' brauchst. Wenn nicht, dann ist Ihre Frage wahrscheinlich N-Werte pro Gruppe, also würde ich vorschlagen, eine andere Frage mit http://rextester.com Beispieldaten und gewünschten Resultset zu stellen. – lad2025