0

我有两张桌子,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

这是行不通的。我假设这是因为加入项目没有首先被选中。

我应该怎么办?

4

2 回答 2

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_bidNULL 值的替换。

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;
于 2013-07-01T17:01:13.797 回答
0

首先,要显示没有出价的项目,您必须使用 a 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
于 2013-07-01T15:09:11.887 回答