我需要计算parent cities
,districts
和regions
上的案件总数
所以,请允许我告诉您目前的情况以及我目前所做的事情
我有两个表[cities]
和[covid19cities]
[城市]表: 参考表
结构为:
------------------------------
| id | parent_id | city_name |
------------------------------
城市等级为:
- Region //[its parent_id = 0]
-- District //[its parent_id = the region id]
---- Parent-city //[its parent_id = the district id]
------ Child-city //[its parent_id = the parent-city id]
[covid19cities]表:
结构为:
-----------------------------------------------------
| id | city_id | date | n_cases | r_cases | d_cases |
-----------------------------------------------------
所以每天我们在[covid19cities]
中填写不同城市的不同案例:
n_cases
=新的covid-19案件; r_cases
=案件恢复; d_cases
=死者案例
到目前为止:
我可以使用以下查询获取每个城市的病例总数(例如新病例):
SELECT sum(`n_cases`) AS city_n_cases, cities.name AS city_name,
cities.id AS city_id,
FROM covid19cities
INNER JOIN cities ON cities.id = covid19cities.city_id
WHERE covid19cities.city_id = '#'
SELECT sum(`n_cases`) AS total_n_cases, FROM covid19cities
现在,我需要计算的总病例数:
那么,我该怎么做呢?我想到的是
但我认为这不是应该这样做的方式。但是,在这种情况下,我不知道如何继续跟踪亲子城市。
感谢您的建议和帮助。
谢谢
p.s. sorry for my English :/
答案 0 :(得分:2)
请考虑以下基本查询,该查询将为您提供每个city_id
的每个案例类别的总和。我们只能通过查看covid19cities
来获得该信息:
select
cvc.city_id,
sum(cvc.n_cases) sum_n_cases,
sum(cvc.r_cases) sum_r_cases,
sum(cvc.d_cases) sum_d_cases
from covid19cities cvc
group by cvc.city_id
现在,我们带上cities
表。这样得到的结果相同,您也可以显示城市名称:
select
c.id city_id,
c.name city_name,
sum(cvc.n_cases) sum_n_cases,
sum(cvc.r_cases) sum_r_cases,
sum(cvc.d_cases) sum_d_cases
from covid19cities cvc
inner join cities c on c.id = cvc.city_id
group by c.id, c.name
从此处开始,我们可以通过在cities
表上添加更多联接并更改select
和group by
子句中的列,逐级向上跟踪层次结构。
让我们获取每个父城市的病例数:我们第二次加入cities
表,别名为pc
(对于父城市):
select
pc.id parent_city_id,
pc.name parent_city_name,
sum(cvc.n_cases) sum_n_cases,
sum(cvc.r_cases) sum_r_cases,
sum(cvc.d_cases) sum_d_cases
from covid19cities cvc
inner join cities c on c.id = cvc.city_id
inner join cities pc on pc.id = c.parent_id
group by pc.id, pc.name
下一个级别是区:
select
d.id distict_id,
d.name district_name,
sum(cvc.n_cases) sum_n_cases,
sum(cvc.r_cases) sum_r_cases,
sum(cvc.d_cases) sum_d_cases
from covid19cities cvc
inner join cities c on c.id = cvc.city_id
inner join cities pc on pc.id = c.parent_id
inner join cities d on d.id = pc.parent_id
group by d.id, d.name
最后,这是在上级给出信息的查询,即区域:
select
r.id region_id,
r.name region_name,
sum(cvc.n_cases) sum_n_cases,
sum(cvc.r_cases) sum_r_cases,
sum(cvc.d_cases) sum_d_cases
from covid19cities cvc
inner join cities c on c.id = cvc.city_id
inner join cities pc on pc.id = c.parent_id
inner join cities d on d.id = pc.parent_id
inner join cities r on r.id = d.parent_id
group by r.id, r.name
更笼统的想法是:请注意,这里的复杂性来自您将层次结构存储在cities
表中这一事实。用单独的表存储每个实体,用外键表示关系会容易得多,例如:
regions: region_id, region_name
districts: district_id, district_name, region_id
parent_cities: parent_city_id, parent_city_name, district_id
cities: city_id, city_name, parent_city_id
采用这种设计,您的最后一个查询如下:
select
r.region_id,
r.region_name,
sum(cvc.n_cases) sum_n_cases,
sum(cvc.r_cases) sum_r_cases,
sum(cvc.d_cases) sum_d_cases
from covid19cities cvc
inner join cities c on c.id = cvc.city_id
inner join parent_cities pc on pc.parent_city_id = c.parent_city_id
inner join districts d on d.district_id = pc.district_id
inner join regions r on r.region_id = d.region_id
group by r.region_id, r.region_name
联接数相同,但是事物存储在不同的表中,因此查询更容易编写和读取。
答案 1 :(得分:1)
由于只有3个级别,没有任意数量的级别,因此我建议您努力工作。表格中有一张表格,表格中有3列,分别代表地区,地区和城市。每天只有几千行,因此缺乏规范化不会导致巨大的磁盘开销。
另一方面,如果这是一个学习练习,请获取MySQL 8或MariaDB 10.2并了解“递归CTE”。