SQL Select 来自多个表并计算第三个

SQL Select from multiple tables and count third

我想计算 table 中被其他 table 的两个字段引用的行数。

我有以下结构

branches table
id, name
1, dev
2, master

levels table
id, name
1, easy
2, hard

repos table
id, name, branch_id, level_id
1, repo-1, 1, 1
2, repo-2, 2, 2

我想要达到的结果

b_id, l_id, r_cnt
1, 1, 1
1, 2, 0
2, 1, 0
2, 2, 1

我试过的语句,但在右连接处出错

SELECT
    b.id,
    l.id,
    COUNT(r)
FROM
    branches b,
    levels l
    RIGHT OUTER JOIN repos r ON r.branch_id = b.id
    AND r.level_id = l.id;

我错过了什么?

你很接近。您查询的主要问题:

  • 您正在混合使用隐式连接和显式连接:只是不要这样做。首先评估显式连接,导致您收到错误(隐式连接 table 尚未确定)

  • 你想要 right join,而不是 left joinright join 非常违反直觉,我建议一般避免使用它们

考虑:

select b.id b_id, l.id l_id, count(r.id)
from branches b
cross join levels l
left join repos r on r.branch_id = b.id and r.level_id = l.id
group by b.id, l.id

这是通过使用 cross join 生成 brancheslevels 的所有可能组合来实现的(这基本上是两个 table 的笛卡尔积),然后带来repos table 和 left join。剩下的就是聚合和计算有多少 repos 记录匹配每个 branch/level 组合。