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!
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
quelle
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.
quelle
id=5 desc
, weil, wenn die Spalte Nullen enthält,!=5
Nullen an erster Stelle stehenWenn 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.
quelle
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
quelle
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.quelle
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
quelle
order by
, wird die gesamte Union sortiert.