我有三个表,描述数据的地方有一些主要的东西,每个东西下面可以有几个类别,每个类别可以有多个细分。
主
| 主标识|主名称|
| - ------|- ------|
| 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个|布拉|第二章|第二章|
| 第二章|鲸脂|第二章|第二章|
2条答案
按热度按时间ecr0jaav1#
我用相同的数据集执行了SQL,
我得到了这个结果,唯一的区别是我使用m作为别名
FROM main m
hmae6n7t2#
看起来您需要使用COUNT(DISTINCT列)的SELECT子句。
这将撤消由JOIN引起的组合爆炸。