Usa order by
. Ecco un metodo:
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;
Questo utilizza la sottoquery per identificare l'unica riga da mantenere in alto. Quindi utilizza queste informazioni per ordinare nella query esterna.
Se le tue righe hanno un identificatore univoco, potresti anche fare:
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;