有表分为四级中国,省,市,学校。
第二张表班级表只和学校的id挂钩,
第三章表学生表只和班级表挂钩。
现求中国下的各个省的学生总数量和省名。
省属于中国,市属于省,学校属于市。
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.名称
我把第一张表只使用了一次。
原来是这样,把第一张表多次使用,学习到了。非常感谢!!!
如果想要顺带查询学校的总数又该怎样呢?count(t3.ID)这样为什么不行呢?
@子明: 顺带有点不好实现,group by 学校才行,count(t3.ID)这个学校是重复很多的
@刘宏玺: group by 学校id的话,是出现了我想要的值,但是重复了,
江西省 4 4
江西省 1 0
江西省 1 0
江西省 4 4
其实应该是 江西省 4 8
如果不group by 学校id的话 连市省都加到t3.id了 也就是10 ,8
这种情况你觉得该怎么办呢?
@子明:
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.名称
@刘宏玺: 你这样情况,我也考虑了。
但是学校也会在其他省里,多个省的话呢。显示的是所有省的所有学校的总数。
湖南省 4 0
江西省 4 8
就这样了。本来是
湖南省 0 0
江西省 4 8
@子明:
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.名称
@刘宏玺: 琢磨了一会并延伸了一下。
这样还是无法分辨学校是属于哪个省的。
@子明: 为啥呢?那个只查询已经在where里面关联省了
@刘宏玺: 查询学校总数这一句看不太懂,求解释~
(select count(1) from 表1 tt left join 表1 tt 1 on tt1.父id = tt.id where 类型= '学校' and tt.父id = t.id) as 学校总数
@刘宏玺:我理解你的tt是省,tt1是市。
这样一来类型方面没法写,只有学校类型是1其他都为0。
你查的都是省或者市没有学校这一栏,再配上类型=‘1’省市里面的类型全为0,所以什么都查不出来
后来我延伸了一下,加了个tt2为公司,类型到是有了,但是还是无法分辨学校是属于哪个省了。
@AKhui: 这句话的意思是查出省市里面类型='学校'的总数。
@刘宏玺: 吃了个饭回来,结果解决了。。
延伸出学校tt2 然后tt2.类型='学校'
应该是tt.ID=t1.ID而不是tt.父id = t.id。否则就会出现无法分辨学校是属于哪个省的。
我的理解是tt.父id = t.id这句话导致了关联的是中国,tt.ID=t1.ID这句话才是关联省,恩,应该是这样。。。。= =
@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 学校总数
@子明: 对,就是这个意思,你好好整理下sql,这种方式肯定可以查到的
@刘宏玺: 恩恩,已经查出来了。非常感谢你的帮助让我学到了好多。= =
@子明:谢谢你,不过这一句里面为何会出现“表2 tt2”,是不是写错了 把“表1”写成 “表2”了
@AKhui: 对,这里打错了
@子明: 好的,谢谢你们~May God bless