Sử dụng order by
. Đây là một phương pháp:
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;
Điều này sử dụng truy vấn con để xác định một hàng cần giữ ở trên cùng. Sau đó, nó sử dụng thông tin này để đặt hàng trong truy vấn bên ngoài.
Nếu các hàng của bạn có một số nhận dạng duy nhất, bạn cũng có thể làm như sau:
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;