我有一张桌子,大概如下所示

level1 level2 level3 key
A B C k1
A B C K2
A B D k2
A B E k3
A F G k4
A F null k5
A null null k6
A B null k7
A B null k8

我希望将层次 struct 信息传递给下边的子数

A-->1
A-->B -->2+1(a)=3
A-->B--->C-->1+2+2( 2 entries for ABC)=5
A--B-->D-->1+2+1=4
A--B-->E-->1-->1+2+1=4
A--F-->1+1=2
A--F-->G-->1+1+1=3

我try 了下面的查询,但没有给出正确的结果

select CONCAT(ifnull(level1, ''), ' > ', ifnull(level2, ''), ' > ', ifnull(level3, '')) as 'foo',COUNT(*) as 'count' from table t t.level1, t.level2, t.level3; 

如何应用聚合函数并获取正确的结果.

推荐答案

try 以下操作:

with concat_levels as 
(
  select concat_ws('>', level1, level2) lvl_1_2, 
         concat_ws('>', level1, level2, level3) lvl_1_2_3, count(*) cn
  from table_name
  group by 1, 2
)
select t1.lvl_1_2_3 as levels, 
       t1.cn + coalesce(sum(t2.cn), 0) as res
from concat_levels t1 left join concat_levels t2
on t1.lvl_1_2_3 like (concat(t2.lvl_1_2, '%')) and 
   length(t1.lvl_1_2_3) > length(t2.lvl_1_2_3)
group by t1.lvl_1_2_3, t1.cn
order by t1.lvl_1_2_3

demo

Mysql相关问答推荐

SQL计算不同的列并返回所有行

如何为Oracle DB查询获得所需的GROUP BY结果?

含有子查询的MySQL函数出现语法错误

根据现有行 Select 月份日期

从连接表中try 按唯一ID计算行数 MySQL

关于设置为 NOT NULL 时的 CHAR 默认值

MySQL函数 - 如何对select查询应用多个条件

优化解析 5000 万行 MySQL 表的请求

多个 FULLTEXT 索引上的 MySQL SELECT.结果极其缓慢

提取 MySQL 5.7 连续值的差异

MySQL REGEXP 在没有 BINARY 模式的情况下区分大小写?

SQL UPDATE中的str_replace?

避免重复进入mysql数据库的最佳方法

加快 MySQL 中的行计数

从终端访问 MAMP 的 MySQL

MySql 以秒为单位的两个时间戳之间的差异?

MySQL - 使一对值唯一

我的 PDO 声明不起作用

MySQL导入数据库但忽略特定表

MySQL更新查询与左连接和分组依据