选择最大值,如果没有条目,则插入0

时间:2013-07-01 15:08:41

标签: sql postgresql left-join aggregate-functions coalesce

我有两个表,itemsbids

create table items (
    id serial primary key,
    store_id int,
    min_bid int
);

create table bids (
    item_id int,
    amount int
);

我想选择项目并包含有关最高出价的信息。

select items.*, max(bids.amount) from items
    join bids on bids.item_id = items.id
where items.store_id = $store_id
group by items.id

但是,如果某个特定商品没有出价,则该商品就不会被选中。如何设置,以便在没有出价时,该项仍会被选中,并使用max(bids.amount)填入items.min_bid列? (或者0也没关系。)

我试过了:

select items.*, coalesce(max(bids.amount), items.min_bid) from items
    join bids on bids.item_id = items.id
where items.store_id = $store_id
group by items.id

哪个不起作用。我假设这是因为加入项目首先没有被选中。

我该怎么办?

2 个答案:

答案 0 :(得分:2)

两个关键要素是LEFT JOINCOALESCE()

SELECT i.*, COALESCE(max(b.amount), 0)
FROM   items i
LEFT   JOIN bids b ON b.item_id = i.id
WHERE  i.store_id = $store_id
GROUP  BY i.id

当使用子表的大部分时,这种替代形式通常更快:首先在子查询中聚合,稍后加入。这样,您不需要外部查询中的聚合。第二个查询还演示了如何提供items.min_bid作为NULL值的替换。

SELECT i.*, COALESCE(b.max_amount, i.min_bid)
FROM   items i
LEFT   JOIN (
   SELECT item_id, max(amount) AS max_amount
   FROM   bids 
   ) b ON b.item_id = i.id
WHERE    i.store_id = $store_id;

答案 1 :(得分:0)

首先,要显示没有出价的项目,您必须使用LEFT JOIN

select items.*, max(bids.amount) 
from items
left join bids on bids.item_id = items.id
where items.store_id = $store_id
group by items.id