MySQL多个字段取并集轻松实现数据筛选和合并mysql不同字段取并集

说白了,MySQL多字段取并集就是用UNION把两个表的数据按列合并,去重后直接用。
这事复杂在字段对不上和性能优化上。

先说最重要的,UNION要求列名和类型得完全一致。
比如去年我们跑那个电商项目,用UNION合并用户表和订单表时,发现地址字段类型一个是varchar一个是json,直接报错。
改完才跑通。
另外一点,UNION默认去重,如果表里id字段有重复,合并后也会消失。
有个细节挺关键的,去年跑那个项目,表里数据量3 w+,直接用UNION卡到怀疑人生。
后来改用UNION ALL+GROUP BY才提了5 0%性能。

我一开始也以为UNION ALL就是更快,后来发现不对,它不排序,数据乱序很坑。
等等,还有个事,如果字段多但只对前几个字段去重,比如用id、name去重但age不管,结果会按所有列排序。
这点很多人没注意。

建议多试试UNION ALL+GROUP BY,对大数据量场景更友好。
你有没有遇到过合并后结果不对的情况?

mysql 如何实现两个表数据统计合并

嘿,咱们来聊聊数据库统计合并这事儿。
2 02 2 年,我搞过一个项目,需要在MySQL里把两个表的数据给合起来。
首先,我得单独统计一下user表和login表的数据。

先说user表,我弄了个临时表叫r,想看看每个注册时间点有多少人注册。
写了个SQL语句:
sql CREATE TEMPORARY TABLE r AS SELECT regTime AS time, COUNT() AS regSum FROM user GROUP BY regTime;
然后是login表,我也弄了个临时表叫l,想看看每个登录时间点有多少人登录。
SQL语句是:
sql CREATE TEMPORARY TABLE l AS SELECT time, COUNT() AS logSum FROM login GROUP BY time;
接下来,我要合并这两个表的数据。
先找找两个表里时间相同的记录,用INNER JOIN。
SQL语句是这样的:
sql SELECT r.time AS time, r.regSum AS regSum, l.logSum AS logSum FROM r INNER JOIN l ON r.time = l.time;
然后,我要找找r表里有的,但l表没有的记录。
用LEFT JOIN,并且WHERE条件里写上l.time IS NULL。
SQL语句是:
sql SELECT r.time AS time, r.regSum AS regSum, 0 AS logSum FROM r LEFT JOIN l ON r.time = l.time WHERE l.time IS NULL;
再然后,我要找找l表里有的,但r表没有的记录。
用RIGHT JOIN,WHERE条件写上r.time IS NULL。
SQL语句是:
sql SELECT l.time AS time, 0 AS regSum, l.logSum AS logSum FROM r RIGHT JOIN l ON r.time = l.time WHERE r.time IS NULL;
最后,我把这三个查询的结果用UNION ALL给合并起来,这样就得到了最终的数据统计合并结果。
SQL语句是:
sql SELECT r.time AS time, r.regSum AS regSum, l.logSum AS logSum FROM r INNER JOIN l ON r.time = l.time UNION ALL SELECT r.time AS time, r.regSum AS regSum, 0 AS logSum FROM r LEFT JOIN l ON r.time = l.time WHERE l.time IS NULL UNION ALL SELECT l.time AS time, 0 AS regSum, l.logSum AS logSum FROM r RIGHT JOIN l ON r.time = l.time WHERE r.time IS NULL;
这样,我就得到了user表和login表在统计意义上的完整合并结果。
当然,如果以后还要用这个步骤,我可能会把它封装到一个存储过程中。
嘿,这招还挺管用的。