我有以下表格:
Animals (animal_id, producer_id, ...)
Producers (prod_id, ...)
BoughtAnimals (animal_id (fk), ...)
我想询问每个制作人,他们有多少动物,以及购买了多少动物。经过深思熟虑后,我尝试了以下方法:
select Producers.name, count (distinct A1.animal_id), count(distinct BoughtAnimals.animal_id)
from Producers, Animals A1, Animals A2, BoughtAnimals
where
Producers.nif = A1.producer_id and
Producers.nif = A2.producer_id and
BoughtAnimals.animal_id = A2.animal_id
group by Producers.name;
但我只是通过反复试验才做到这一点,而且我发现很难一次推理几张动物表。有没有其他方法来进行此查询?或者这是通常的做法吗?
答案 0 :(得分:3)
尝试这样的事情
select p.name,
sum(case when ba.anyfield is not null then 1 else 0 end) bought_count,
count(1) total_count
from Producers p join Animals a on (p.nif = a.producer_id)
left join BoughtAnimals ba using (animal_id)
group by p.name;
答案 1 :(得分:1)
使用简单的JOIN,然后可以将“COUNT”放在HAVING语句中。请参阅LEFT / INNER JOIN和HAVING的文档,具体取决于您的SGDB。
答案 2 :(得分:0)
我现在忽略了制作人表;您需要的所有关键数据都在另外两个表中。一旦这部分是正确的,你可以在producer表上进行内部联接,以获得你需要的其他细节。
select a1.producer_id,
count(a1.animal_id) as num_animals,
count(b1.animal_id) as num_bought
from animals a1
left join boughtanimals b1 on (b1.animal_id = a1.animal_id)
group by producer_id;
我不清楚最后一栏是否更好地命名为“num_bought”或“num_sold”。同样不清楚的是生产者“拥有”动物是什么意思,因为有些动物是买卖的。