mysql SQL: Bestimmtes Element, das zuerst erstellt und dann der Rest der Elemente sortiert werden soll

79

Nehmen wir an, ich habe die folgende Tabelle.

Ich möchte alle Freunde haben, aber ich möchte, dass die ID 5 das erste Element in der Liste ist. Es ist mir egal, in welcher Reihenfolge ich den Rest der Artikel erhalte.

Das gewünschte Abfrageergebnis lautet:

friends
-------

id    name

5     nahum
1     moshe
2     haim
3     yusuf
4     gedalia
6     dana

Wie kann ich das machen?

mit MySQL 5.1.x.

Vielen Dank!

ufk
quelle

Antworten:

147
select id,name 
from friends 
order by id=5 desc

(vorausgesetzt, Sie kümmern sich nicht um die Reihenfolge der anderen, sonst z. B. Ruhe durch id asc )

select id,name 
from friends 
order by id=5 desc, id asc
RichardTheKiwi
quelle
10
@ maxx777 Diese Frage ist mit MySQL gekennzeichnet, das jetzt Oracle gehört. Nicht "SQL-Server" wie in Microsoft SQL Server.
RichardTheKiwi
1
Ich denke, die meisten Abfragen funktionieren auf allen DBMS. Und wenn jemand sagt, dass diese Abfrage auf einem bestimmten DBMS nicht funktioniert, fragt er normalerweise nach einer Lösung für dieses bestimmte DBMS.
Maxx777
8
@ maxx777 Deshalb haben wir Tags und separate Fragen. Es funktionierte für den Fragesteller für sein MySQL-Problem. Wenn Sie SQL Server 2005 möchten, hat die andere Antwort dies. Sie müssen nicht kommentieren, dass diese Antwort nicht für das funktioniert, wofür sie nie angekündigt wurde.
RichardTheKiwi
48

Versuche dies:

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

Wenn Sie mehr als eine haben, können Sie Folgendes tun:

select id,name 
from friends 
order by case when id in (5,15,25) then -1 else id end,id
Dumitrescu Bogdan
quelle
4

Ich kann jetzt nicht auf MySQL zugreifen, um es zu testen, daher könnte es umgekehrt sein ... aber Sie können die Tatsache nutzen, dass Boolesche Werte auch sortieren und dass Sie mehrere Sortierfelder haben können.

SELECT ... ORDER BY id != 5, id

(Möglicherweise müssen Sie schreiben id = 5, ich kann mich nicht erinnern, ob TRUEs vor oder nach FALSEs sortiert wurden.)

EDIT: Oh, ich habe gerade gelesen, dass Sie sich nicht um die Reihenfolge der anderen kümmern. In diesem Fall empfehle ich @ Richards Antwort von Herzen.

Amadan
quelle
3
Ich bevorzuge id=5 desc, weil, wenn die Spalte Nullen enthält, !=5Nullen an erster Stelle stehen
RichardTheKiwi
2

Wenn Sie dasselbe für die UNION-Abfrage tun möchten, haben Sie beispielsweise Folgendes:

select id,name 
from friends 
UNION
select id,name 
from friends 
order by id=5 desc

... Sie würden eine Ausnahme in PostgreSQL bekommen:

Es können nur Ergebnisspaltennamen verwendet werden, keine Ausdrücke oder Funktionen. TIPP: Fügen Sie jedem SELECT den Ausdruck / die Funktion hinzu oder verschieben Sie die UNION in eine from-Klausel

Um dies zu umgehen, würden Sie Folgendes verwenden:

select id,name, (id=5) AS is_five
from friends 
UNION
select id,name, (id=5) AS is_five
from friends 
order by is_five DESC, id DESC

Der Ausdruck (id = 5) würde 't' ODER 'f' zurückgeben, abhängig davon, ob Ihr Spaltenwert dem erwarteten Wert (5) entspricht oder nicht. Die Reihenfolge nach würde also zuerst die 't'-Spalten und dann die sich ausruhen.

Ucello
quelle
2

Sie sollten die ORDER BY FIELD-Klausel von MySQL verwenden, um dies zu lösen. Obwohl die Antwort darauf akzeptiert wurde, ist hier eine bessere Lösung.

select 1 id, 'Zeta' order_col union all
select 2 id, 'Alpha' order_col union all
select 3 id, 'Gamma' order_col union all
select 4 id, 'Phi' order_col union all
select 5 id, 'Delta' order_col union all
select 6 id, 'Delta' order_col union all
select 7 id, 'Alpha' order_col union all
select 8 id, 'Gamma' order_col union all
select 9 id, 'Zeta' order_col union all
select 10 id, 'Phi' order_col 
order by field (order_col, 'Alpha', 'Gamma', 'Phi', 'Delta', 'Zeta'), id;

Das ist besser als

  • id = etwas, Reihenfolge nach id asc
  • Reihenfolge für Fall, wenn etwas dann 1 wenn etwas_else dann 2 Ende absteigend
Monty Python
quelle
1
Ich bin mir nicht sicher, warum dies abgelehnt wurde. Ich würde gerne wissen, warum die Reihenfolge nach Feldern besser sein sollte, aber die Antwort ist interessant.
John
@ John - Dies ist vor allem wegen der guten Lesbarkeit besser. Es ist auch eine Lösung, die MySQL uns sofort zur Verfügung stellt. Es scheint mir nur, dass dies sinnvoller ist, wenn Sie die Reihenfolge für viele Werte in einer Spalte angeben müssen.
MontyPython
1
Ich denke, die Leute haben einfach nicht verstanden, dass Sie ein Beispiel mit der "Union All" und der Lösung der Frage mit dem Feld ORDER BY geliefert haben. Daher sind die Abstimmungen nur auf Inkompetenz zurückzuführen.
John
Ich überprüfe alle meine Antworten unter Berücksichtigung von @ Strawberrys Post - meta.stackoverflow.com/questions/333952/… .
MontyPython
2

Sie können field()in MySQL verwenden.

select id,name from friends order by field(id,5,id)

Der 1. Parameter in Feld () bedeutet das Feld, mit dem Sie sortieren möchten, der Rest ist in der Reihenfolge.

Also wird 5 zuerst sortiert und der Rest von id (ohne 5). Sie können tun, field(id,5,1,3,id)wenn Sie möchten, dass 5,1,3 vorne ist.

5 kann ausgewählt werden, um endlich nach zu sortieren field(id,id,5). Die 2. ID schließt auch 5 davon aus.

Jeffrey Neo
quelle
-7

Dies ist ein wenig hässlich, weil es Code-Duplikate gibt, aber es macht den Trick:

select .... where id = 5 
union
select .... where not id = 5
Ilya Kogan
quelle
2
Wenn Zeilen nach einer Vereinigung geordnet bleiben, ist das nur ein Unfall. Und wenn Sie eine angeben order by, wird die gesamte Union sortiert.
Andomar