MySQL-Reihenfolge nach bestimmten ID-Werten


94

Ist es möglich, in MySQL nach "Reihenfolge nach" zu sortieren, indem ein vordefinierter Satz von Spaltenwerten (ID) verwendet wird, wie: Reihenfolge nach (ID = 1,5,4,3), so dass ich darin Datensatz 1, 5, 4, 3 erhalten würde bestellen?

UPDATE: Über den Missbrauch von MySQL ;-) Ich muss erklären, warum ich das brauche ...

Ich möchte, dass meine Datensätze alle 5 Minuten zufällig sortiert werden. Ich habe eine Cron-Aufgabe, die Aktualisierungstabelle zu erstellen, um eine andere, zufällige Sortierreihenfolge einzugeben. Es gibt nur ein Problem! SEITENNUMMERIERUNG. Ich werde einen Besucher haben, der auf meine Seite kommt, und ich gebe ihm die ersten 20 Ergebnisse. Er wird 6 Minuten warten und zu Seite 2 gehen, und er wird falsche Ergebnisse haben, da sich die Sortierreihenfolge bereits geändert hat.

Also dachte ich, wenn er auf meine Seite kommt, stelle ich alle IDs in eine Sitzung und wenn er auf Seite 2 ist, bekommt er die richtigen Datensätze heraus, auch wenn sich die Sortierung bereits geändert hat.

Gibt es eine andere Möglichkeit, dies besser zu tun?


Fragen Sie, ob es eine Möglichkeit gibt, wie MySQL in keiner bestimmten Reihenfolge bestellen kann?
Stefgosselin

1
Es hört sich so an, als ob entweder Ihr Datenmodell kaputt / unvollständig ist ( woher kommt diese Reihenfolge?) Oder Sie missbrauchen MySQL.
Derobert

Antworten:


200

Sie können die Funktionen ORDER BY und FIELD verwenden. Siehe http://lists.mysql.com/mysql/209784

SELECT * FROM table ORDER BY FIELD(ID,1,5,4,3)

Es verwendet die Funktion Field () , die laut Dokumentation "den Index (die Position) von str in der Liste str1, str2, str3, ... zurückgibt. Gibt 0 zurück, wenn str nicht gefunden wird". Sie sortieren also die Ergebnismenge nach dem Rückgabewert dieser Funktion, der der Index des Feldwerts in der angegebenen Menge ist.


Ich kann nicht scheinen, dies zum Laufen zu bringen, ohne auch zu verwenden: WHERE ID IN (1,5,4,3)
TV-C-15

funktioniert wie Magie!
Danielpr

30

Sie sollten in der Lage sein, CASEdies zu verwenden:

ORDER BY CASE id
  WHEN 1 THEN 1
  WHEN 5 THEN 2
  WHEN 4 THEN 3
  WHEN 3 THEN 4
  ELSE 5
END

18

In der offiziellen Dokumentation zu MySQL zu ORDER BY hat jemand Folgendes veröffentlicht, das Sie FIELDfür diese Angelegenheit verwenden können:

SELECT * FROM table ORDER BY FIELD(id,1,5,4,3)

Dies ist ungetesteter Code, der theoretisch funktionieren sollte.


7
SELECT * FROM table ORDER BY id='8' DESC, id='5' DESC, id='4' DESC, id='3' DESC

Wenn ich zum Beispiel 10 Registries hatte, werden auf diese Weise zuerst die ID 1, 5, 4 und 3 angezeigt, die anderen Registries als nächstes.

Normale Ausstellung 1 2 3 4 5 6 7 8 9 10

Auf diese Weise

8 5 4 3 1 2 6 7 9 10


Ok Danke für den Rat
Bruno Mangini Alves

6

Es gibt noch einen anderen Weg, dies zu lösen. Fügen Sie eine separate Tabelle hinzu:

CREATE TABLE `new_order` (
  `my_order` BIGINT(20) UNSIGNED NOT NULL,
  `my_number` BIGINT(20) NOT NULL,
  PRIMARY KEY (`my_order`),
  UNIQUE KEY `my_number` (`my_number`)
) ENGINE=INNODB;

Diese Tabelle wird nun verwendet, um Ihren eigenen Bestellmechanismus zu definieren.

Fügen Sie dort Ihre Werte hinzu:

my_order | my_number
---------+----------
       1 |         1
       2 |         5
       3 |         4
       4 |         3

... und ändern Sie dann Ihre SQL-Anweisung, während Sie dieser neuen Tabelle beitreten.

SELECT *
FROM your_table AS T1
INNER JOIN new_order AS T2 on T1.id = T2.my_number
WHERE ....whatever...
ORDER BY T2.my_order; 

Diese Lösung ist etwas komplexer als andere Lösungen, aber mit dieser Lösung müssen Sie Ihre SELECTAussage nicht ändern, wenn sich Ihre Bestellkriterien ändern. Ändern Sie einfach die Daten in der Auftragstabelle.


0
SELECT * FROM TABLE ORDER BY (columnname,1,2) ASC OR DESC

2
Können Sie das weiter erklären? Dies sieht ähnlich aus wie die akzeptierte Antwort, aber ich denke nicht, dass dies ASC OR DESCdie richtige Syntax ist
Nico Haase

@NicoHaase der Unterschied zwischen ASC und DESC ist, wenn Sie asc verwenden, dann werden die IDs, die Sie in der Feldfunktion verwenden, enden und wenn Sie DESC verwenden, werden IDs in der Feldfunktion zuerst kommen
Hisham shahid

@NicoHaase Sie können entweder ASC oder DESC mit der Abfrage verwenden, die entweder der Anforderung entspricht
Hisham

Sie können also nicht beide in einer Abfrage verwenden. Ich denke, Nico hat vorgeschlagen, dass Sie Ihre Antwort syntaktisch korrekt gemacht haben. Ich bin mir ziemlich sicher, dass er
weiß,

0

Wenn Sie im Ergebnis zuerst eine einzelne ID bestellen müssen, verwenden Sie die ID.

select id,name 
from products
order by case when id=5 then -1 else id end

Wenn Sie mit einer Folge von mehreren IDs beginnen müssen, geben Sie eine Auflistung an, ähnlich wie Sie sie mit einer INAnweisung verwenden würden.

select id,name 
from products
order by case when id in (30,20,10) then -1 else id end,id

Fügen Sie einige weitere Beschreibung hinzu
Mathews Sunny

Wenn Sie order by nur für eine ID verwenden möchten, verwenden Sie die 1. Abfrage. Wenn Sie mehrere IDs verwenden möchten, verwenden Sie die 2. Abfrage
Rajesh Kharatmol

0

Wenn Sie eine einzelne ID als letztes im Ergebnis bestellen möchten, verwenden Sie die Reihenfolge für den Fall. (ZB: Sie möchten die Option "Andere" in der letzten und alle Stadtlisten werden in alphabetischer Reihenfolge angezeigt.)

select id,city 
from city
order by case 
when id = 2 then city else -1 
end, city ASC

Wenn ich zum Beispiel 5 Städte hatte, möchte ich die Stadt in alphabetischer Reihenfolge mit der Option "Andere" anzeigen, die zuletzt in der Dropdown-Liste angezeigt wird, dann können wir diese Abfrage verwenden. siehe Beispiel andere werden in meiner Tabelle unter der zweiten ID (ID: 2) angezeigt, daher verwende ich "wenn ID = 2" in der obigen Abfrage.

Datensatz in DB-Tabelle:

Bangalore - id:1
Other     - id:2
Mumbai    - id:3
Pune      - id:4
Ambala    - id:5

meine Ausgabe:

Ambala  
Bangalore  
Mumbai  
Pune
Other

2
Versuchen Sie, Ihrem Code eine Erklärung hinzuzufügen, damit Ihre Antwort klarer und verständlicher wird. Bitte lesen Sie stackoverflow.com/help/how-to-answer
32cupo

Wenn Sie die Reihenfolge nach nur für eine ID verwenden möchten (z. B. möchten Sie die Option "Andere" in der letzten und alle Stadtlisten in alphabetischer Reihenfolge anzeigen), können Sie diese Abfrage verwenden. es funktioniert für mich.
Preeti
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.