因为业务需求,遇到了这么一个查询,本想一个联合查询就完事了,谁知三张表之间没有任何关联,这就使我苦恼了半天,终于想出了解决办法。
首先,三张表之间没有任何关联,字段也不尽相同,我们要使查询结果合并就需要使用 union all 关键字(过滤重复数据使用union 就可以了)
假设我们有三张表 user,info,system
查询如下
select * from (
(select as aaaid from user)
union all (select from info)
union all (select from system)
) as abc
这样的查询会以第一张表查询的列为列头 所以上述查询的列头应该是 aaaid ,那么这样的查询一旦列的类型和数量不对应的话,就会出错,另外,最后的 as abc是必须添加的,mysql会把三张表的查询结果存在虚拟表 abc 中
如果我要查询第二张表里的 age 字段,而第一张表和第三张表中没有此字段,可以用第一张表里的任意一个类型对应的字段代替,只要第三张表给出对应类型的字段也能查询出结果,也可以用常量来代替查询结果,但是如果三张表的列数量和类型都不尽相同,那这样的查询就无法应对。对于这种情况,我们的查询应该是这样的:
select * from (
(select as aaaid,null as age from user)
union all (select , from info)
union all (select ,null from system)
) as abc
这样,我们就把对应的第二张表中的 age 字段查询出来了,而且把第一张表和第三张表中对应的内容填上了null,这时候的查询结果基本满足我们的需求,如果需要添加条件或者分页的话,查询就变成了这样:
select * from (
(select as aaaid,null as age from user)
union all (select , from info)
union all (select ,null from system)
) as abc
where age is not null
limit 0,10
where条件下的列就是第一张表查询的列,否则会报错。
这样,我们就完成了三张不同列、无关系表的条件查询和分页。
在此记录一下
转载请说明出处/qq_36395578/article/details/84936605