原因:作為一名資料人員,經常會碰到類似這樣的表結構:
city_id city_code city_name parent_id citylevel
1 中國 中國 0 0
2 110000 北京市 1 0
3 120000 天津市 1 0
4 130000 河北省 1 0
5 140000 山西省 1 0
6 150000 內蒙古自治區 1 0
7 210000 遼寧省 1 0
8 220000 吉林省 1 0
9 230000 黑龍江省 1
其中parent_id代表本條資料的上一層級id,citylevel代表本條資料的所屬層級,這樣的表結構會把含有多個層級的資料放在一張表中,層級關係用parent_id和citylevel來表示,這種類似於碼表的資料(如城市碼表,標籤碼表)後台開發的同學往往會設計成這樣的表結構。
但是對於應用資料的同學來說,這樣的表結構非常讓人頭疼,因為往往他需要的是一層一層平鋪開來的資料,比如全國、省、市、縣的訂單量各有多少,想實現像資料透視表那樣的效果,比如:
區(縣)id 區(縣) 市id 市 省id 省 全國id 全國 單量
110101 東城區 110000 北京市 110000 北京市 0 全國 3598
110102 西城區 110000 北京市 110000 北京市 0 全國 4973
110105 朝陽區 110000 北京市 110000 北京市 0 全國 4033
110106 豐台區 110000 北京市 110000 北京市 0 全國 3731
110107 石景山區 110000 北京市 110000 北京市 0 全國 4159
110108 海淀區 110000 北京市 110000 北京市 0 全國 4426
110109 門頭溝區 110000 北京市 110000 北京市 0 全國 3370
110111 房山區 110000 北京市 110000 北京市 0 全國 3922
110112 通州區 110000 北京市 110000 北京市 0 全國 3188
110113 順義區 110000 北京市 110000 北京市 0 全國 3902
110114 昌平區 110000 北京市 110000 北京市 0 全國 3257
110115 大興區 110000 北京市 110000 北京市 0 全國 3193
110116 懷柔區 110000 北京市 110000 北京市 0 全國 3319
110117 平谷區 110000 北京市 110000 北京市 0 全國 3103
110228 密雲縣 110000 北京市 110000 北京市 0 全國 4589
110229 延慶縣 110000 北京市 110000 北京市 0 全國 4463
130102 長安區 130100 石家莊市 130000 河北省 0 全國 4273
130103 橋東區 130100 石家莊市 130000 河北省 0 全國 3483
如何實現這樣的效果呢?即將乙個縱向關係表變為乙個橫向關係表?
可以這樣寫:
select
substr(c.finish_time,1,10)
,t1.name
,t2.name
,t3.name,count(c.id)
from tags t1
left join tags t2 on
t2.parent_id=t1.id
left join tags t3 on
t3. parent_id=t2.id
left join orders c on
(c.tag_id=t3.id
or c.tag_id=t2.id
or c.tag_id=t1.id)
where t1.level=1
group by c.tag_id,substr(c.finish_time,1,10)
結論:對於縱向表,可以先將其轉化為橫向的碼表,不論什麼樣的碼表不管有幾層,只要有level 和parent_id這樣的,都可以用如下方式轉化:
select
t1.name
,t2.name
,t3.name
from tags t1
left
join tags t2 on t2.parent_id=t1.id
left
join tags t3 on t3. parent_id=t2.id
where t1.level=1
或者:
select
a.`name`
,b.`name`
,c.`name`
from `tags`
a left join tags b on a.`id`=b.`parent_id`
left join tags c on b.`id`=c.`parent_id`
where a.`parent_id` is null
上述sql的層級均為**,如果還有更多的層級,繼續向下join就行了,只要切記在最後的where中限定parent_id或者level即可。 mysql開發分層 mysql的分層以及功能
第一次接觸分層思想是在學習網路的時候,osi7層模型,各層完成自己的任務互相不干擾。在mysql中也採用用這種思想,這麼做的好處就是規定了各層的功能那個,出現什麼問題就去找各層的問題。大大減少了工作量。那麼在mysql中大概分為四層 1 鏈結層 2 服務層 3 儲存引擎層 4 儲存層 一 鏈路層 主...
SparkSql實現Mysql到hive的資料流動
今天去面試了一波,因為排程系統採用了sparksql實現資料從mysql到hive,在這一點上面試官很明顯很不滿我對於spark的理解,19年的第乙個面試就這麼掛了。有問題不怕,怕的是知道了問題還得過且過。現在就來梳理下我的專案是怎麼使用spark導數的 第一步 把mysql中的表放入記憶體 pro...
HIVE資料匯入MYSQL實現方式
以下內容均 其他csdn博主的優秀內容 一 python指令碼導數 import os import pymysql hive sql beeline u jdbc hive2 n 使用者名稱 p 密碼 showheader false outputformat csv2 e select from...