本人需要用MySQL实现如下功能:
表A
name,ID
AAA,1000.1.1
AAA,1000.1.1
BBB,1000.1.3
BBB,1000.1.3
CCC,1000.1.4
CCC,1000.1.4
DDD,1000.1.5
DDD,1000.1.5
EEE,1000.1.7
EEE,1000.1.7
FFF,1011.8.9
GGG,1011.8.10
HHH,1011.8.11
III,1011.8.12
JJJ,1011.8.13
KKK,1011.8.14
KKK,1011.8.14
LLL,1011.8.15
MMM,1011.8.16
表B
ID1,name1,ID2,name2
1000.1.3,BBB,6016,01A
1000.1.4,CCC,6016,01A
1000.1.5,DDD,6016,01A
1000.1.9,NNN,6016,01A
1000.1.26,OOO,6009,01B
1000.1.193,PPP,6006,01C
1000.1.194,QQQ,6007,01D
1000.3.8,RRR,7008,02A
1000.4.12,SSS,NULL,NULL
表C
shortID,ID2,name2
1000.1,6016,01A
表D和表B结构一样,用来存放最终想要的结果
注明下ID,ID1,ID2之类的字段都是“数字1.数字2.数字3”这样的结构
要实现的功能是:
1.清除表A的重复记录
2.生成表C:只有当表B的ID2以6开头且不为NULL的时候,才进行下面的操作
shortID是表B的ID1去掉最后一个点以及数字3之后的值。
筛选出所有的shortID,ID2,name2组合,然后统计频次,如下:
1000.1,6016,01A
1000.1,6016,01A
1000.1,6016,01A
1000.1,6016,01A
1000.1,6009,01B
1000.1,6006,01C
统计结果(最后一列是频次):
1000.1,6016,01A,4
1000.1,6009,01B,1
1000.1,6006,01C,1
那么就把频次最高的一行1000.1,6016,01A放入表C,其余忽略
对于其他shortID的各种组合,也进行同样处理,并选出频次最高的一行放入表C。
3.用表A的ID来关联表B的ID1
如果能找到相关结果(若ID2值为NULL,算没找到),就直接把表B的那一行插入表D
如果找不到相关结果,那么就拿A的ID的“数字1.数字2”去和表C的shortID进行匹配
能匹配上的就按照如下格式输出到表D:表A的ID,表A的name,表C的ID2,表C的name2
匹配不上,就忽略,不输出。
遍历表B的所有行
如果这一行的ID2不是NULL,就直接插入到D中,注意不要和表D当中已有的记录重复。
如果这一行的ID2是NULL,就拿这一行的ID1和上面表A的ID以同样的处理方式来处理。