Вариант 1
SELECT .... WHERE price > 0 AND ... ORDER BY ...
UNION
SELECT .... WHERE price = 0 AND ... ORDER BY ...
Вариант 2
SELECT ... IF (price > 0, 1, 0) as has_price ... ORDER BY has_price DESC ...
Вариант 3
Аналогичен варианту 2, но has_price хранить явно в базе
PS Считаю что самый правильный 3й