主页 > 互联网  > 

mysql多表重复数据只保留一行的思路

mysql多表重复数据只保留一行的思路
一、问题描述

假设有3个表,test_a,test_b,test_c;

test_a和test_b中有些重复数据;

现在要把这2个表的数据同步到表c,但是重复数据只保留1行。

样例如下: 具体要求如下: 1.test_a与test_b中都存在的数据(根据card关联),以test_a为准,并且把authority字段拼起来(逗号分隔),移动到test_c

2.对于test_a不存在但是test_b存在的数据,以test_b为准,移动到test_c

3.对于test_a存在但是test_b不存在的数据,以test_a为准,移动到test_c

二、sql样例

1.首先查询到test_a不存在但是test_b存在的数据:

SELECT NULL AS user_id, b.card, b. NAME, b.authority FROM test_b b LEFT JOIN test_a a ON b.card = a.card WHERE a.id IS NULL

使用a.id is null,就说明是test_b存在、test_a不存在了; 然后可以把这部分数据存入test_c

2.然后查询test_a 存在 && ( test_b 存在 || test_b 不存在)的数据

SELECT a.user_id, a.card, ifnull(a.NAME, b.NAME), CASE WHEN a.authority IS NULL AND b.authority IS NULL THEN NULL WHEN a.authority IS NOT NULL AND b.authority IS NOT NULL THEN concat( a.authority, ',', b.authority ) WHEN a.authority IS NOT NULL AND b.authority IS NULL THEN a.authority WHEN a.authority IS NULL AND b.authority IS NOT NULL THEN b.authority ELSE a.authority END AS authority FROM test_a a LEFT JOIN test_b b ON a.card = b.card

使用了ifnull(a.NAME, b.NAME),,可以当test_a表的数据为空时(不准确了),使用test_b表的数据;

注意这里有个坑,使用concat(a.authority,',',b.authority)时,如果有一个表的数据为null,那么最终结果就会是null,不符合预期;

//这样有些问题 //select a.user_id,a.card,a.name,a.authority,b.authority,concat(a.authority,',',b.authority) from test_a a left join test_b b on a.card=b.card

并且还需要判断是否需要拼接,;

因此sql中使用了case when写法。

标签:

mysql多表重复数据只保留一行的思路由讯客互联互联网栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“mysql多表重复数据只保留一行的思路