order by
винаги ще бъде скъпо, особено ако изразът в реда от не е индексиран. Така че не поръчвайте. Вместо това направете произволно отместване в count()
както във вашите заявки, но направете всичко наведнъж.
with t as (
select *
from
products p
inner join
images i using (productid)
where
prodtype = $sometype
)
select *
from t
offset floor(random() * (select count(*) from t))
limit 1
Тази версия може да е по-бърза
with t as (
select *, count(*) over() total
from
products p
inner join
images i using (productid)
where
prodtype = $sometype
)
select *
from t
offset floor(random() * (select total from t limit 1))
limit 1