gpt4 book ai didi

mysql - 如何从联合表中选择不相等的列

转载 作者:行者123 更新时间:2023-11-29 09:35:48 26 4
gpt4 key购买 nike

我有五个表,我需要联合查询它们。

表的创建方式如下(为了简洁起见,我将发布一个创建语句,如果您需要复制,请重复该命令,并将表名称更改为t2t3 t4t5):

CREATE TABLE `t1` (
`id` int(11) NOT NULL,
`name` varchar(45) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

创建表后,每个表中有 2 行。

t1 数据:

# id, name
'1', 'a'
'2', 'b'

t2 数据:

# id, name
'1', 'a'
'2', 'c'

t3 数据:

# id, name
'1', 'a'
'2', 'd'

t4 数据:

# id, name
'1', 'a'
'2', 'e'

t5 数据:

# id, name
'1', 'a'
'2', 'f'

然后我联合对 5 个表进行查询。该查询的目的是当五个表中的name 都不相等时提取行。

查询:

select `t1`.`name` as 't1 name', `t2`.`name` as 't2 name', `t3`.`name` as 't3 name', `t4`.`name` as 't4 name', `t5`.`name` as 't5 name'    
from `test`.`t1`
join `test`.`t2` on `t1`.`id` = `t2`.`id`
join `test`.`t3` on `t2`.`id` = `t3`.`id`
join `test`.`t4` on `t3`.`id` = `t4`.`id`
join `test`.`t5` on `t4`.`id` = `t5`.`id`

where not(`t1`.`name` = `t2`.`name` and
`t2`.`name` = `t3`.`name` and
`t3`.`name` = `t4`.`name` and
`t4`.`name` = `t5`.`name`);

我的问题是:有没有更好的方法来形成 where 语句?我只是觉得这是一个漫长的条件。有没有更好的方法来提取所有表中名称列不相等的行?或者这是测试他们平等的唯一可能的方法?

最佳答案

如果您要求 id 位于所有五个表中并查找不相等的名称,那么 join 是一种合理的方法。您可以使用 least()greatest() 进行比较:

select `t1`.`name` as 't1 name', `t2`.`name` as 't2 name', `t3`.`name` as 't3 name', `t4`.`name` as 't4 name', `t5`.`name` as 't5 name'    
from `test`.`t1` join
`test`.`t2`
on `t1`.`id` = `t2`.`id` join
`test`.`t3`
on `t2`.`id` = `t3`.`id` join
`test`.`t4`
on `t3`.`id` = `t4`.`id` join
`test`.`t5`
on `t4`.`id` = `t5`.`id`
where least(t1.name, t2.name, t3.name, t4.name, t5.name) <> greatest(t1.name, t2.name, t3.name, t4.name, t5.name);

如果你想查找不在所有五个表中或具有不同名称的id,那么上面的方法将不起作用。为此,请使用 union all,但对 Salman 的方法略有不同:

select id, group_concat(distinct name) as names
from ((select id, name, 1 as which from t1) union all
(select id, name, 2 as which from t2) union all
(select id, name, 3 as which from t3) union all
(select id, name, 4 as which from t4) union all
(select id, name, 5 as which from t5)
) t
group by id
having count(distinct which) <> 5 or
min(name) <> max(name);

关于mysql - 如何从联合表中选择不相等的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57624393/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com