Jslfl【软件开发技术笔记】

mysql 查询并集记要

两张表tb_a,tb_b数据分别如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
tb_a:
id  uid f1
--------------------
1   1   11
2   1   12
3   1   13
4   1   14
5   2   15
6   2   16
7   4   177

tb_b:
id  uid f1
--------------------
1   1   21
2   1   22
3   1   23
4   2   24
5   2   25
6   3   26
7   3   27

最终所需效果为(对uid对应的f1属性进行统计,MAX,SUM)
uid MAX(a.f1)   MAX(b.f1)
---------------------------------
1   14      23
2   16      25
3   NULL        27
4   177     NULL

SQL:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SELECT IFNULL(t.u1,t.u2) AS uid,t.f1,t.f2 FROM(
    SELECT t1.uid AS u1,t1.f1 AS f1,t2.uid AS u2,t2.f1 AS f2 FROM(
        SELECT uid,MAX(f1) AS f1 FROM tb_a GROUP BY uid
    ) t1 LEFT JOIN(
        SELECT uid,MAX(f1) AS f1 FROM tb_b GROUP BY uid
    ) t2 ON t1.uid=t2.uid

    UNION

    SELECT t1.uid AS u1,t1.f1 AS f1,t2.uid AS u2,t2.f1 AS f2 FROM(
        SELECT uid,MAX(f1) AS f1 FROM tb_a GROUP BY uid
    ) t1 RIGHT JOIN(
        SELECT uid,MAX(f1) AS f1 FROM tb_b GROUP BY uid
    ) t2 ON t1.uid=t2.uid
) t ORDER BY uid

主要原理:left join + union + right join
union会对结果去重复,在大数据量下可能较耗时

Comments are currently closed.