MySQL объединяет две таблицы на основе столбца и исключая значения другого столбца - PullRequest
0 голосов
/ 18 октября 2019

У меня есть две таблицы.

  1. Таблица проекта
  2. Таблица отношений проекта

Таблица проекта содержит все идентификаторы проекта и имя

Id:1, name:project1
Id:2, name:project2
Id:3, name:project3
Id:4, name:project4
Id:5, name:project5
Id:6, name:project6

Таблица отношений проекта содержит родительско-дочерние отношения между всеми проектами.

parent:1, child:2
parent:1, child:3
parent:4, child:5

Здесь родитель и потомок относятся к идентификаторам проекта. Я хочу запрос на соединение, чтобы получить список только родительских проектов вместе с их количеством дочерних проектов.

Как это

Id:1, name:project1, count:2
Id:4, name:project4, count:1
Id:6, name:project6, count:0

Ответы [ 2 ]

1 голос
/ 18 октября 2019

Это будет считать ребенка для проектов без родителей.

SELECT p.id, p.name,
       COUNT(prC.child) AS childrenCount
FROM projects AS p
LEFT JOIN project_relations AS prC on p.id = prC.parent -- relations to children
LEFT JOIN project_relations AS prP ON p.id = prP.child -- relations to parent
WHERE prP.parent IS NULL -- no relation to a parent found
GROUP BY p.id, p.name
1 голос
/ 18 октября 2019

Если я правильно понимаю, это должно делать то, что вы хотите при условии, что у вас нет отношений, вложенных более чем в одну глубокую :

select coalesce(pr.parent, p.id), count(pr.child)
from project p left join
     projectrelationship pr
     on pr.child = p.id
group by coalesce(pr.parent, p.id);

join относится к ребенок в отношениях. Это дает два случая:

  • Если есть дочерние элементы, тогда pr.parent является родительским идентификатором.
  • Если нет дочерних элементов, то у left join нет соответствия, и p.id является идентификатором родителя.

Затем group by агрегирует по родителю и подсчитывает потомков от pr.

...