1

网页应显示 PostgreSql 数据库中特定产品类别的一张产品图片。此图像应在每 25 秒后自动更改为其他图像。退回的产品可能是随机的或按顺序排列的。有些产品可能会丢失,有些产品可能会重复,但标准中的大多数产品都应该退回。样本检索之间的可用图像总数可能会略有变化

目前使用下面的代码,每 25 秒执行一次。这需要对数据库进行两次查询:一次查询可能是 slwo 的计数,第二次查询单个图像检索。在子句重复的这两种情况下,在实际应用中 where 子句非常大并且更改它需要在两个地方进行更改。

如何改进这一点,以便单个查询返回样本?列类型不能更改,使用自然主键。如果有帮助,可以添加其他列、触发器、索引、序列。

使用 ASP.NET/Mono MVC3 , npgsql。

$count = select count(*)
         from products
         where prodtype=$sometype and productid in (select productid from images);

$random = next random integer between 0 .. $count-1;

--  $productsample  is result: desired sample product
$productsample = select product
          from products
          where prodtype=$sometype and productid in (select productid from images)
          offset $random
          limit 1;


create table products ( productid char(20) primary key,
   prodtype char(10) references producttype 
);

create table images(
id serial primary key, 
productid char(20) references products,
mainimage bool
);
4

2 回答 2

2

如果 order by 中的表达式没有被索引, Anorder 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
于 2013-05-30T17:46:47.227 回答
0

PostgreSQL:

SELECT column FROM table
ORDER BY RANDOM()
LIMIT 1

这给了你一个随机的行。您当然可以在 WHERE 过滤器中重新添加以确保它是正确的类别。

这消除了您首先进行计数的要求;并且还具有让数据库引擎进行选择的优点,减少了往返。

注意:对于在其他 SQL 引擎中寻找方法的人:http ://www.petefreitag.com/item/466.cfm

于 2013-05-30T16:01:08.300 回答