记录一次日常操作
业务场景: 公司在某汽车网抓取来汽车品牌款式类型数据,给我的是文本格式(而且是树形结构 品牌关联款式 款式关联类型),让我在一天之内整合到公司项目中。起初一脸盲然,这咋整,光品牌就313种,某的办法,就开干了。
首先文本需要是这种格式的
Z 众泰 众泰E200 微型车
Z 众泰 众泰ES330 微型车
Z 众泰 众泰Z100 微型车
Z 中华 中华豚 微型车
Z 知豆 知豆D2 微型车
Z 知豆 知豆D3 微型车
Z 知豆 知豆 微型车
A 奥迪 奥迪A0 微型车
A 阿斯顿·马丁 Cygnet 微型车
A ARCFOX ARCFOX-1 微型车
B 本田 Brio 微型车
B 本田 Gear 微型车
B 本田 N BOX 微型车
B 本田 N ONE 微型车
B 本田 本田e 微型车
B 本田 本田Urban EV 微型车
B 比亚迪 比亚迪e1 微型车
B 比亚迪 比亚迪F0 微型车
B 比亚迪 福莱尔 微型车
B 宝骏 宝骏E100 微型车
B 宝骏 宝骏E200 微型车
接下来说正事
楼主用的数据库工具是Navicat,其他的工具不知道,应该都支持文本导入。咳咳
先将文本数据导入数据库
如何将文本数据导入数据库
然后捋顺头绪,品牌关联款式 款式关联类型 那品牌肯定是最大的喽(那品牌就是爷爷,款式是爸爸,类型是儿子) ,ok 接下来品牌分组去重
DELETE
FROM
表名
WHERE
f_id IN (
SELECT
dv.id
FROM
(
SELECT
MAX(tbcd2.f_id) AS id
FROM
表名 tbcd2
GROUP BY
tbcd2.f_id
) dv
)
为什么要在中间边再查一次呢,mysql有修改的语句不能直接根据中间表操作,据说oracle不会有此错误
品牌这个爷爷去玩重就该给个爷爷标识了,这个大家应该明白吧,就是给个pid。ok
UPDATE 表名 tbcd
SET tbcd.f_pid =- 1
WHERE
tbcd.f_id != 0
哦,原来这么简单 ,需要注意的是建议修改前的每一步先备份一份表格数据,毕竟数据库操作不可逆吗。
接下来爸爸找爷爷,此处需要多建了一个品牌备用字段例如 f_brand2 , 这样我们返回第一步再重新导入这个表,相同的数据全部倒进去, 不同的是品牌导入f_brand2。
然后重点来了,修改语句要怎么写电脑才能明白让爸爸找爷爷修改好pid呢。lz在这里有点卡壳,所以写出来给大家分享下经验,要是有更好的办法可以联系楼主。
update 表名1 tbcd3,表名2 tbcd4 set tbcd4.f_pid = tbcd3.f_id
where
tbcd3.f_brand = tbcd4.f_brand2
and tbcd4.f_pid != -1
表名1 和 表名2 是同一张表这个应该能理解吧,咳咳。
接下来 儿子找爸爸也是相同的操作,不同的是通过款式 咳咳。