select.union all .where.解决方案

时间:2022-09-05 17:04:05

需求:有三张表且没有物理外键和逻辑外键,但我需要拿到三个表中需要的数据且不能重复,包括各字段名的值各个表中的数据且不能相同。

先创建三张表:A,B,C
A表:
select.union all .where.解决方案

B表:
select.union all .where.解决方案
C表:
select.union all .where.解决方案

三个表中没有关联字段,各表之间的字段数量是不一样的。

如果我们想要拿到三个表或更多表解决方案是使用union 活union all。
union:操作符用于合并两个或多个 SELECT 语句的结果集。且不会出现重复记录。
union all:操作符用于合并两个或多个 SELECT 语句的结果集。且会出现重复记录。

使用union之前一定要知道:UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。
否则出现下面这种错误:
select.union all .where.解决方案

第一种:

SELECT a.id AS id, a.name AS NAME, a.type AS TYPE,NULL AS age,NULL AS sex FROM A a UNION SELECT b.id AS id,NULL AS NAME,NULL AS TYPE, b.age AS age,NULL AS sex FROM B b UNION SELECT c.id AS id,NULL AS NAME,NULL AS TYPE, c.age AS age ,c.sex AS sex FROM C c

获取的结果集:
select.union all .where.解决方案

但是这种有一个缺点就是你想要根据条件去查询的话就会出现问题

select.union all .where.解决方案

比如每个表多一个字段叫status状态 0和1表示
但想要的结果集就是所有status=1的 可以在每条sql前加一个status
具体看需求是怎么规定的。

SELECT a.id AS id, a.name AS NAME, a.type AS TYPE,NULL AS age,NULL AS sex,a.status AS STATUS FROM A a WHERE a.status=1 UNION SELECT b.id AS id,NULL AS NAME,NULL AS TYPE, b.age AS age,NULL AS sex ,b.status AS STATUS FROM B b WHERE b.status=1 UNION SELECT c.id AS id,NULL AS NAME,NULL AS TYPE, c.age AS age ,c.sex AS sex,c.status AS STATUS FROM C c WHERE b.status=1

如果要排序或是分页 直接在后面加 order by 字段名 limit 0,10

第二种:

下面这条语句可以为我们解决单个条件查询。

SELECT * FROM( SELECT a.id AS id, a.name AS NAME, a.type AS TYPE,NULL AS age,NULL AS sex FROM A a UNION SELECT b.id AS id,NULL AS NAME,NULL AS TYPE, b.age AS age,NULL AS sex FROM B b UNION SELECT c.id AS id,NULL AS NAME,NULL AS TYPE, c.age AS age ,c.sex AS sex FROM C c )X WHERE id='A'

带条件查询并获取的结果

select.union all .where.解决方案

如果是多个条件是查询不到结果集的,如果有请一定要在下面留言给我。

如果你对mysql感兴趣的话可以深入研究,
第一种为什么不能进行条件查询?
第二种为什么能进行条件查询?
我们可以探讨一下qq: 44702145

如果以上内容有错请在下面留言给我,等待我查看后会及时修改。