MySQL:计算多个左连接的结果

9rnv2umw  于 2023-01-12  发布在  Mysql
关注(0)|答案(2)|浏览(144)

我有三个表,描述数据的地方有一些主要的东西,每个东西下面可以有几个类别,每个类别可以有多个细分。

| 主标识|主名称|
| - ------|- ------|
| 1个|布拉|
| 第二章|鲸脂|
范畴
| 目录号|主标识|类别名称|
| - ------|- ------|- ------|
| 四个|1个|布拉猫|
| 五个|1个|蓝猫|
| 六个|第二章|布莱卡特|
| 七|第二章|水泡猫|
片段
| 片段标识|目录号|段名称|
| - ------|- ------|- ------|
| 十个|四个|布拉塞格|
| 十一|四个|布吕布塞格|
| 十二|五个|布利塞格|
| 十三|六个|斑点片段|
我在主表中增加了一列,显示每个主要内容下面的类别数,以及属于它的所有类别中的细分总数。
| 主标识|主名称|n_猫|n_分段|
| - ------|- ------|- ------|- ------|
| 1个|布拉|第二章|三个|
| 第二章|鲸脂|第二章|1个|
我尝试使用以下SQL语句:

SELECT
    m.main_id, m.main_name, count(c.cat_id) as n_cats, count(s.seg_id) as n_segs
FROM main
    LEFT JOIN categories c ON c.main_id = m.main_id
    LEFT JOIN segments s ON s.cat_id = c.cat_id
GROUP BY m.main_id

但是它为n_cats和n_segs产生相同的值,而不是所需的不同值:
| 主标识|主名称|n_猫|n_分段|
| - ------|- ------|- ------|- ------|
| 1个|布拉|第二章|第二章|
| 第二章|鲸脂|第二章|第二章|

ecr0jaav

ecr0jaav1#

我用相同的数据集执行了SQL,

SELECT
    m.main_id, m.main_name, COUNT(c.cat_id) AS n_cats, COUNT(s.seg_id) AS n_segs
FROM main m
    LEFT JOIN categories c ON c.main_id = m.main_id
    LEFT JOIN segments s ON s.cat_id = c.cat_id
GROUP BY m.main_id

我得到了这个结果,唯一的区别是我使用m作为别名FROM main m

hmae6n7t

hmae6n7t2#

看起来您需要使用COUNT(DISTINCT列)的SELECT子句。

SELECT m.main_id, m.main_name, 
       count(DISTINCT c.cat_id) as n_cats, 
       count(DISTINCT s.seg_id) as n_segs

这将撤消由JOIN引起的组合爆炸。

相关问题