我有两个表,items
和bids
。
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
哪个不起作用。我假设这是因为加入项目首先没有被选中。
我该怎么办?
答案 0 :(得分:2)
两个关键要素是LEFT JOIN
和COALESCE()
。
LEFT [OUTER ]JOIN
上COALESCE()
使用提供的替代方法替换NULL值 - 在这种情况下为0
。
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