首页 新闻 会员 周边 捐助

有关于sql Server较为复杂的查询功能

0
悬赏园豆:10 [已解决问题] 解决于 2016-02-25 09:51

有表分为四级中国,省,市,学校。

第二张表班级表只和学校的id挂钩,

第三章表学生表只和班级表挂钩。

现求中国下的各个省的学生总数量和省名。

问题补充:

省属于中国,市属于省,学校属于市。

子明的主页 子明 | 初学一级 | 园豆:109
提问于:2016-02-25 09:23
< >
分享
最佳答案
0

select t.名称 as 省名,count(t5.id) 学生总数  from 表1 t
left join 表1 t1 on t1.父id = t.id--关联省
left join 表1 t2 on t2.父id = t1.id--关联市
left join 表1 t3 on t3.父id = t2.id--关联学校
left join 表2 t4 on t4.学校id = t3.id--关联班级
left join 表3 t5 on t5.班级id = t4.id--关联学生

where t.id = 中国id

group by t.名称

收获园豆:10
刘宏玺 | 专家六级 |园豆:14020 | 2016-02-25 09:46

我把第一张表只使用了一次。

原来是这样,把第一张表多次使用,学习到了。非常感谢!!!

子明 | 园豆:109 (初学一级) | 2016-02-25 09:51

如果想要顺带查询学校的总数又该怎样呢?count(t3.ID)这样为什么不行呢?

子明 | 园豆:109 (初学一级) | 2016-02-25 10:24

@子明: 顺带有点不好实现,group by 学校才行,count(t3.ID)这个学校是重复很多的

刘宏玺 | 园豆:14020 (专家六级) | 2016-02-25 10:28

@刘宏玺: group by 学校id的话,是出现了我想要的值,但是重复了,

江西省 4 4
江西省 1 0
江西省 1 0
江西省 4 4

其实应该是 江西省 4 8  

如果不group by 学校id的话 连市省都加到t3.id了  也就是10 ,8

这种情况你觉得该怎么办呢?

子明 | 园豆:109 (初学一级) | 2016-02-25 10:52

@子明: 

select t.名称 as 省名,count(t5.id) as 学生总数,(select count(1) from 表1 where 类型= '学校') as 学校总数 from 表1 t
left join 表1 t1 on t1.父id = t.id--关联省
left join 表1 t2 on t2.父id = t1.id--关联市
left join 表1 t3 on t3.父id = t2.id--关联学校
left join 表2 t4 on t4.学校id = t3.id--关联班级
left join 表3 t5 on t5.班级id = t4.id--关联学生

where t.id = 中国id

group by t.名称

刘宏玺 | 园豆:14020 (专家六级) | 2016-02-25 10:55

@刘宏玺: 你这样情况,我也考虑了。

但是学校也会在其他省里,多个省的话呢。显示的是所有省的所有学校的总数。

湖南省 4 0
江西省 4 8

就这样了。本来是 

湖南省 0 0
江西省 4 8

子明 | 园豆:109 (初学一级) | 2016-02-25 10:59

@子明: 

select t.名称 as 省名,count(t5.id) as 学生总数,(select count(1) from 表1 tt left join 表1 tt 1 on tt1.父id = tt.id where 类型= '学校' and tt.父id = t.id) as 学校总数 from 表1 t
left join 表1 t1 on t1.父id = t.id--关联省
left join 表1 t2 on t2.父id = t1.id--关联市
left join 表1 t3 on t3.父id = t2.id--关联学校
left join 表2 t4 on t4.学校id = t3.id--关联班级
left join 表3 t5 on t5.班级id = t4.id--关联学生

where t.id = 中国id

group by t.名称

刘宏玺 | 园豆:14020 (专家六级) | 2016-02-25 11:02

@刘宏玺: 琢磨了一会并延伸了一下。 

这样还是无法分辨学校是属于哪个省的。

子明 | 园豆:109 (初学一级) | 2016-02-25 11:31

@子明: 为啥呢?那个只查询已经在where里面关联省了

刘宏玺 | 园豆:14020 (专家六级) | 2016-02-25 11:32

@刘宏玺: 查询学校总数这一句看不太懂,求解释~

(select count(1) from 表1 tt left join 表1 tt 1 on tt1.父id = tt.id where 类型= '学校' and tt.父id = t.id) as 学校总数

 

AKhui | 园豆:82 (初学一级) | 2016-02-25 11:50

@刘宏玺:我理解你的tt是省,tt1是市。

这样一来类型方面没法写,只有学校类型是1其他都为0。

你查的都是省或者市没有学校这一栏,再配上类型=‘1’省市里面的类型全为0,所以什么都查不出来

后来我延伸了一下,加了个tt2为公司,类型到是有了,但是还是无法分辨学校是属于哪个省了。

子明 | 园豆:109 (初学一级) | 2016-02-25 11:51

@AKhui: 这句话的意思是查出省市里面类型='学校'的总数。  

子明 | 园豆:109 (初学一级) | 2016-02-25 11:56

@刘宏玺: 吃了个饭回来,结果解决了。。

延伸出学校tt2  然后tt2.类型='学校'

应该是tt.ID=t1.ID而不是tt.父id = t.id。否则就会出现无法分辨学校是属于哪个省的。

我的理解是tt.父id = t.id这句话导致了关联的是中国,tt.ID=t1.ID这句话才是关联省,恩,应该是这样。。。。= =

子明 | 园豆:109 (初学一级) | 2016-02-25 12:49

@AKhui: 说的有点不严谨,我觉得那句话想表达的意思是关联省级id,然后查询省市学校,再count类型='学校'

(select count(1) from 表1 tt left join 表1 tt1 on tt1.父id = tt.id left join 表2 tt2 on tt2.父id=tt1.id where tt2.类型= '学校' and tt.id = t1.id) as 学校总数

子明 | 园豆:109 (初学一级) | 2016-02-25 12:53

@子明: 对,就是这个意思,你好好整理下sql,这种方式肯定可以查到的

刘宏玺 | 园豆:14020 (专家六级) | 2016-02-25 12:55

@刘宏玺: 恩恩,已经查出来了。非常感谢你的帮助让我学到了好多。= =  

子明 | 园豆:109 (初学一级) | 2016-02-25 12:57

@子明:谢谢你,不过这一句里面为何会出现“表2 tt2”,是不是写错了 把“表1”写成 “表2”了

AKhui | 园豆:82 (初学一级) | 2016-02-25 15:56

@AKhui: 对,这里打错了

子明 | 园豆:109 (初学一级) | 2016-02-25 15:58

@子明: 好的,谢谢你们~May God bless

AKhui | 园豆:82 (初学一级) | 2016-02-25 16:00
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册