将不同层次的记录输入到一个结果集中

本文探讨如何在SQL中获取不同层次记录的计数,同时保持层级顺序。通过一个示例,展示了一种使用集算器SPL解决此问题的方法,该方法将多层数据进行JOIN、分组并合并,生成包含各级别计数的有序结果集。适合于报表或JAVA集成中处理复杂的数据聚合问题。
摘要由CSDN通过智能技术生成

【问题】

Is there a way to get one count of connected items to the parent level and one count for the child level without braking this into two query’s?

I have two (relevant) mysql tabels. Courses_regions is used to connect courses to regions.

Regions{id, name, parent_id}
Courses_regions{id, region_id, course_id}

The data that I want to display on my front-end is a list of Region, sub-region and number of items (courses) connected to the regions like so.

Parent_region_name_a ( 5 )
 Child_region_name_a (2)
 Child_region_name_b (3)
Parent_region_name_b ( 8 )
 Child_region_name_a (5)
 Child_region_name_b (3)

This query gives me the result I want, but without the count

 SELECT
t1.name AS lev1_name,
t1.id AS lev1_id,
t2.name AS lev2_name,
t2.id AS lev2_id
 FROM regions AS t1
 LEFT  JOIN regions AS t2 ON t2.parent_id = t1.id
 WHERE t2.name IS  NOT  NULL
 ORDER  BY t1.name

The result is:

 lev1_name lev1_id lev2_name lev2_id
-----------------------  -------  ---------------  ---------
Blekinge län 3Olofström 188
Blekinge län 3Karlshamn 191
Blekinge län 3Sölvesborg 192
Dalarnas län 4Vansbro 319
Test län 5Gagnef 321
Test län 5Leksand 322
Test län 5Rättvik 323

This allow me to display the parent and sub regions with one query, but I can’t figure out how to add separate Count for level 1 and level 2.

Any suggestions?

表内容如下:

Table regions:
id name parent_id
3 Blekinge 1
4 Dalarnas 2
5 Test 6
188 Olofstrom  3
191 Karlshamn 3
192 Solvesborg 3
319 Vansbro 4
321 Gagnef 5
322 Leksand 5
323 Rattvik 5
1 T1
2 T2
Table course:
id courseName
1 english
2 Chinese
3 Karlshamn
4 Vansbro
5 Blekinge Lan
Table courses_regions:
id region_id  course_id
1 3 4
2 5 3
3 3 5
4 4 2
5 188 4
6 4 1

【回答】

将三层数据按顺序拼接到一个结果集,SQL 的办法通常是把三层数据分别计算出来后再 UNION,同时为每层数据设定排序项用于最后输出成希望的次序,整个代码显得非常冗长且不直观。

这种情况下用集算器 SPL 辅助实现,代码更直观易懂:

A
1$select ts.id id,ts.name name,ts.parent_ID parentID,tp.name as parentName, cr.course_ID courseID,c.courseName courseName from regions ts left join regions tp on tp.id=ts.parent_ID left join courses_regions cr on cr.region_ID=ts.id join course c on c.id=cr.course_id where ts.parent_ID is not null
2=A1.group(parentID)
3=A2.conj([~.parentID,parentName,~.count(),1]|~.group(id).conj([id,name,~.count(),2])|~.group@s(id).conj([courseID,courseName,null,3]))
4=create(ID,Name,Count,Levl).record(A3)

A1: 简单的 join 语句,建立 3 表关联。

A2: 对数据表按照 parentID 分组。

A3: 对序列做合并,生成最终序表要显示的记录。

A4: 创建空序表,用序列 A3 成员组成序表的新记录。

集算器是结构化数据计算工具,可以通过 JDBC 接口与报表或 JAVA 集成,很适合解决此类问题,可参考Java 如何调用 SPL 脚本

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值