Verwenden Sie order by
. Hier ist eine Methode:
select t.*
from (select t.*, (@rn := @rn + 1) as seqnum
from tickets t cross join
(select @rn := 0) params
order by vip desc, rand()
) t
order by (seqnum = 1) desc, price asc;
Dies verwendet die Unterabfrage, um die eine Zeile zu identifizieren, die oben bleiben soll. Dann verwendet es diese Informationen zum Sortieren in der äußeren Abfrage.
Wenn Ihre Zeilen eine eindeutige Kennung haben, können Sie auch Folgendes tun:
select t.*
from tickets t cross join
(select id from tickets where vip = 1 order by rand() limit 1) as t1
order by (t.id = t1.id) desc, price asc;