Имея 3 сущности, получим в итоге третью сущность, основываясь на количестве (количестве) отношений двух других сущностей. - PullRequest
0 голосов
/ 11 февраля 2019

У меня есть 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

Так что мне нужно посчитать Item для каждого типа, и после получения DISTINCT владельцев, упорядоченного пососчитать.

Я не знаю, как подойти к этому порядку по количеству.

Ожидается - Пример:

Итак, если для Типа I выберите name: 'alpha', что соответствует id 1

item_id, соответствующие Type с id 1: 1,3,4

Элемент (ы) с идентификатором 1,3, соответствующий owner_id, равен 1 (количество = 2).Элемент с идентификатором 4, соответствующим owner_id, равен 3 (количество = 1).

Таким образом, результат (по порядку) будет owner1, owner3

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

Этот запрос приведет к желаемым результатам.Он находит все элементы, которыми владеет каждый владелец, затем фильтрует их по типу элемента, чтобы включить в него только элементы типа 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

Демонстрация на dbfiddle

0 голосов
/ 11 февраля 2019

Вы можете попробовать ниже -

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
...