2015-05-11 10 views
8

Angenommen, ich habe eine Datenbank, die Tabelle enthält Zeilen mit IDs von 1 bis 20.mysql - Reihenfolge nach Feld funktioniert nicht richtig

Ich möchte 3 Zeilen mit ID 3,4,1 zuerst zurückgeben und dann die anderen Zeilen zurückgeben. dies ist mein Code:

SELECT id 
FROM prod 
ORDER BY field(id, 3, 4, 1) 
LIMIT 20 

dies das Ergebnis dieses Codes ist:

id 
13 
17 
16 
15 
7 
6 
5 
2 
3 
4 
1 

seltsam die drei Zeilen, die ich zum ersten Mal zeigen, sind am Ende kommen müssen,

Wie kann ich Bringe diese 3 Zeilen an die Spitze der Liste?

Dank

Antwort

6

Sie desc verwenden können:

SELECT id 
FROM prod 
ORDER BY field(id, 3, 4, 1) DESC 
LIMIT 20 

Das Problem ist, dass MySQL NULL Werte an erster Stelle stehen, wenn Sie durch eine aufsteigende Reihenfolge tun.

Wenn Sie tatsächlich die Zeilen in der Reihenfolge 3 wollen, 4, 1 (das ist die Frage auf diese Anforderung vage ist), dann umkehren sie in der field Aussage:

SELECT id 
FROM prod 
ORDER BY field(id, 1, 4, 3) DESC 
LIMIT 20 

Oder, wenn man wollte seine Phantasie:

ORDER BY - field(id, 3, 4, 1) DESC 
+0

@sgtBOSE versuchen. . . Ich bin mir nicht sicher, was der Kommentar sein soll. Dadurch werden die drei Zeilen an die Spitze der Liste gesetzt, und darum bittet das OP. –

+0

Die Lösung ist jetzt vorhanden. :) –

0

Versuchen mit DESC

SELECT id 
FROM prod 
ORDER BY field(id, 3, 4, 1) DESC 
LIMIT 20 

Es sieht ms Ihre ID-Reihenfolge ist wichtig. Reverse-Zahlen korrektes Ergebnis

SELECT id 
FROM prod 
ORDER BY field(id, 1, 4, 3) DESC 
LIMIT 20 
1

Der andere Weg zu bekommen, ist case-when zu verwenden und jeden id ein order value

select * from prod 
order by 
case 
    when id = 3 then 0 
    when id=4 then 1 
    when id=1 then 2 
    else 3 
end,id 
limit 20 
; 
0

Nicht getestet geben, aber Sie können

SELECT id, 
     (
      CASE 
       WHEN id = '3' THEN 0 
       WHEN id = '4' THEN 1 
       WHEN id = '1' THEN 2 
      END 
     ) as rank 
     FROM prod 
     ORDER BY rank 
     LIMIT 20; 
Verwandte Themen