PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Come restituire una riga di esempio dal database una per una

Un order by sarà sempre costoso specialmente se l'espressione nell'ordine per non è indicizzata. Quindi non ordinare. Invece fai un offset casuale nel count() come nelle tue domande, ma fallo tutto in una volta.

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

Questa versione potrebbe essere più veloce

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