我在编写性能良好的查询时遇到了一些麻烦。现在我有两张桌子:
汽车:
id brand model_name
1 'Audi' 'A4'
2 'Audi' 'A4'
3 'Audi' 'A4'
4 'Audi' 'A6'
5 'Audi' 'A7'
买家:
id cars_id name activly_looking
1 2 'Brad' 'no'
2 2 'Kim' 'maybe'
3 4 'Sofia' 'yes'
4 4 'Tim' 'no'
5 5 'Tina' 'yes'
现在我需要选择以下车辆的数量:有买家但没有任何买家activly_looking = 'yes'
此示例中的查询应返回1
的计数,因为只有标识为2
的汽车才符合条件。
顺便说一句。这将作为调试问题的一次性查询完成,但是在一个非常庞大的表(数百万行)上。
答案 0 :(得分:1)
您可以使用exists
和not exists
检查条件,然后只进行汇总查询:
select count(*)
from cars c
where exists (select 1 from buyers b where b.cars_id = c.id) and
not exists (select 1 from buyers b where b.cars_id = c.id and b.acively_looking = 'yes')
答案 1 :(得分:1)
使用条件聚合的另一种方式来过滤所有拥有actively_looking = yes
买家的汽车。
内部联接确保汽车至少有1名买家,并且有条款确保没有买家正在积极寻找。
select count(*) from (
select c.id from cars c
join buyers b on b.cars_id = c.id
group by c.id
having count(case when b.activly_looking = 'yes' then 1 end) = 0
) t1
答案 2 :(得分:-1)
试试这个
select count(b.cars_id) from
from cars c
left join buyers b on b.cars_id = c.id
where b.activly_looking = 'yes'
group by c.id