SQL - подсчет количества связанных записей в другой таблице - PullRequest
0 голосов
/ 09 января 2019

Поскольку я новичок в SQL, я не могу описать проблему простым способом, поэтому позвольте мне показать вам пример:

3 таблицы:

ПРОДУКТ

  • ID
  • group_id
  • person_id

GROUP

  • ID
  • имя

PERSON

  • ID
  • group_id

Как видите, GROUP может иметь несколько ЧЕЛОВЕК, а ПРОДУКТ может быть связан с GROUP и PERSON.

С этого момента я бы хотел посчитать количество ЛИЦ, имеющих ПРОДУКТ в ГРУППЕ

Я не совсем понимаю фон IN или использую другой SELECT в рамках FROM, поэтому, если в этом суть, то я счастлив, что я был на шаг раньше, чем это.

SELECT 
group.name as GROUP_name, 
COUNT(DISTINCT person_id) AS PERSON_having_min_one_PRODUCT 
FROM products
LEFT JOIN groups ON groups.id = products.group_id 
LEFT JOIN persons ON persons.id = products.person_id;

С этими данными:

GROUP
ExampleGroupName1 has 3 PERSONs, but 2 of them has >0 PRODUCTS
ExampleGroupName2 has 3 PERSONs and all of them has >0 PRODUCTS
ExampleGroupName3 has 2 PERSONs, but none of them has the PRODUCT
ExampleGroupName4 has 2 PERSONs, but only 1 has >0 PRODUCT

Я бы хотел получить такой вывод:

GROUP_name | PERSON_having_min_one_PRODUCT
ExampleGroupName1 | 2
ExampleGroupName2 | 3
ExampleGroupName4 | 1

Ответы [ 2 ]

0 голосов
/ 09 января 2019

Это скорее будет просто, как показано ниже, означая все группы с некоторыми group_id с count(persons) и те, у кого есть некоторый продукт по идентификатору, использовавшемуся в предложении

         Select group_id,
         count( distinct id ) AS "PERSON_WITH_PRODUCT" 
         from 
         person group by group_id having id
         in (Select id from product);
0 голосов
/ 09 января 2019

Я бы хотел посчитать количество ЛИЦ, имеющих ПРОДУКТ, в ГРУППЕ

Примечание : я предполагаю, что в таблице product нет столбца group_id, поскольку он является избыточным и может привести к множеству ошибок.

Следующий запрос покажет вам желаемый результат, соединив таблицы person и product:

select
  count(distinct x.id)
from person x
join product p on p.person_id = x.id
where x.group_id = 123 -- choosing a specific group
  and p.id = 456 -- choosing a specific product
...