Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如果有3个实体,则根据其他2个实体的关系数(计数)得到第三个实体_Sql_Postgresql_Postgresql 10 - Fatal编程技术网

Sql 如果有3个实体,则根据其他2个实体的关系数(计数)得到第三个实体

Sql 如果有3个实体,则根据其他2个实体的关系数(计数)得到第三个实体,sql,postgresql,postgresql-10,Sql,Postgresql,Postgresql 10,我有3个实体,类型,项目,所有者 所有者 一个所有者可以有多个项目 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

我有3个实体,类型,项目,所有者

所有者

一个所有者可以有多个项目

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
因此,我需要对每种类型的项目进行计数,然后根据计数对所有者进行排序

我不知道如何通过计数来处理这个订单

预期-示例:

因此,如果对于类型I,选择与id 1相对应的
名称
:“alpha”

与具有
id 1
Type
对应的
item\u id
为:
1,3,4

id为
1,3
对应
所有者id
的项目为1(计数=2)。 id为
4
对应
所有者id
的项目为3(计数=1)

因此,结果(按顺序)将是
owner1,owner3

您可以在下面尝试-

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
你可以在下面试试-

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

此查询将获取所需的结果。它查找每个所有者拥有的所有项目,然后按项目类型对其进行过滤,以仅包括
alpha
类型的项目,然后对所有者拥有的项目数量进行
计数,并按该值降序对结果进行排序:

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

此查询将获取您想要的结果。它查找每个所有者拥有的所有项目,然后按项目类型对其进行过滤,以仅包括
alpha
类型的项目,然后对所有者拥有的项目数量进行
计数,并按该值降序对结果进行排序:

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