具有3个实体,得到第三个实体结果的基础上,其他2个实体的关系(计数)的数量

问题描述 投票:0回答:2

我有3个实体,类型,项目,业主

所有者

id name
1   owner1
2   owner2
3   owner3

业主可以有多个项目

Item

id   name  owner_id
1   item1  1
2   item2  1
3   item3  1 
4   item4  3
5   item5  2

Type 

id name
1  alpha 
2  beta

有一个很多项和类别之间的一对多关系。一个项目可以有多个类型,和类型可以有多个项目

Item_Type

id item_id type_id

1   1       1
2   1       2 
3   3       1
4   4       1

通过名字给人一种类型,我需要得到具有该类型的项目所有业主,每类型项目的数量排序。

我使用PostgreSQL 10。

于是我开始:

SELECT Type.name, Item_Type.item_id from Type WHERE Type.name = 'my_var' INNER JOIN Item_Type ON Type.id = Item_Type.type_id

所以,我需要计算每个类型项目,并得到后业主通过DISTINCT计数排序。

我不知道如何计数接近这个顺序。

预期 - 例如:

因此,如果I型选择name:“阿尔法”对应于id 1

与对应于item_idTypeid 11,3,4

ID为1,3对应owner_id的项目(s)为1(计数= 2)。 ID为4对应owner_id该项目3(计数= 1)。

所以结果是,(为了)将owner1, owner3

sql postgresql postgresql-10
2个回答
1
投票

你可以试试下面 -

DEMO

select d.name as ownername,count(distinct c.name) as itemcount from 
Item_Type a 
inner join Types b on a.type_id=b.id
inner join Item c on a.item_id=c.id
inner join Owner d on c.owner_id=d.id
group by d.name

1
投票

这个查询将获取您想要的结果。它发现所有的每个业主拥有的项目,然后按项目类型过滤他们只包括那些类型alpha的,然后做项目的拥有者数量的COUNT,并通过该值下降的结果进行排序:

SELECT t.name, o.name, COUNT(i.id) AS num_type
FROM Owner o
JOIN Item i ON i.owner_id = o.id
JOIN Item_Type it ON it.item_id = i.id
JOIN Type t ON t.id = it.type_id
WHERE t.name = 'alpha'
GROUP BY t.name, o.name
ORDER BY num_type DESC

输出:

name    name    num_type
alpha   owner1  2
alpha   owner3  1

Demo on dbfiddle

© www.soinside.com 2019 - 2024. All rights reserved.