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

时间:2019-08-23 10:27:14

标签: mysql sql database relational-database mysql-workbench

我有五个表,我需要一起查询它们。

创建表的方式如下(为简便起见,我将发布一条create语句,如果您需要复制,请重复执行此命令,将表名更改为t2t3,{ {1}}和t4):

t5

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

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

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

然后我对该5个表进行联合查询。该查询旨在在所有五个表中的# id, name '1', 'a' '2', 'f' 不相等时提取行。

查询:

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`); 语句?我只是觉得这是一个长期的条件。有没有更好的方法来提取所有表中name列不相等的行?还是这是检验他们平等的唯一可能方法?

1 个答案:

答案 0 :(得分:1)

如果您要求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);