【问题标题】:MySQL join for two tables based on on column and excluding the values of another columnMySQL 基于列连接两个表并排除另一列的值
【发布时间】:2019-10-18 16:12:32
【问题描述】:

我有两张桌子。

  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

【问题讨论】:

  • 现在您只是要求我们用定制的教程重写您的教科书并完成您的(家庭)作业,而您没有表现出任何研究或其他努力。需求转储不是主题问题。请参阅How to Ask,点击谷歌搜索“stackexchange 作业”和投票箭头鼠标悬停文本。按照教科书的理由展示您的工作步骤,并在您遇到困难的地方进行解释。此外,这是一个很容易用谷歌搜索的常见问题解答。
  • 嗨@philipxy 并不是我没有尝试过这样做。我自己尝试过这样做,但遇到了两种情况,即我通过 child_id 加入并选择空子 ID。我会得到主项目而不是子项目计数,如果我通过 parent_id 加入,那么 cont 会在那里,但我不想要的孩子也会在那里。然后我想进行两次连接,但这会导致性能问题。如果你觉得它可以很容易地用谷歌搜索,请在下一条评论中与我分享链接。提前致谢
  • 请通过编辑而非 cmets 进行澄清。请在代码问题中给出minimal reproducible example--cut & paste & runnable code;具有期望和实际输出(包括逐字错误消息)的示例输入(作为初始化代码);标签和版本;明确的规范和解释。这包括您可以提供的最少代码,即您显示的代码可以通过您显示的代码扩展为不正常。 (调试基础。)对于包含 DBMS/产品和 DDL 的 SQL,其中包括约束和索引以及表格格式的初始化。展示你能做的任何相关部分。

标签: mysql sql join left-join


【解决方案1】:

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

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 是关系中的 child。这给出了两种情况:

  • 如果有子代,则pr.parent 是父代ID。
  • 如果没有子代,则 left join 不匹配,p.id 是父代 ID。

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

【讨论】:

  • 您的查询回答了我的问题。谢谢你。但是你能解释一下你是如何限制子项目的[2,3,5]。正如我所看到的,你只加入了一个。
  • 感谢您的编辑和解释。我在一次加入时打破了我的头脑,但你如何在 group by 中使用合并确实完成了这项工作。谢谢你。
【解决方案2】:

这将在没有父母的项目中计算孩子。

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

【讨论】:

    猜你喜欢
    • 2022-12-04
    • 2011-02-17
    • 2011-03-29
    • 1970-01-01
    • 2019-05-30
    • 1970-01-01
    • 1970-01-01
    • 2017-10-28
    • 2021-12-02
    相关资源
    最近更新 更多