首页 > 解决方案 > MySQL 基于列连接两个表并排除另一列的值

问题描述

我有两张桌子。

  1. 项目表
  2. 项目关系表

项目表包含所有项目 ID 和名称

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

这里的 parent 和 child 指的是项目 ID。我想要一个连接查询来获取唯一的父项目列表及其子项目计数。

像这样

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

标签: mysqlsqljoinleft-join

解决方案


如果我理解正确,假设您没有嵌套超过一层的关系,这应该可以满足您的要求:

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就是父母ID。
  • 如果没有子代,则left join没有匹配项,并且p.id是父代 ID。

然后group by由父级聚合并计算来自 的子级pr


推荐阅读