我有五个表,我需要一起查询它们。
创建表的方式如下(为简便起见,我将发布一条create语句,如果您需要复制,请重复执行此命令,将表名更改为t2
,t3
,{ {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列不相等的行?还是这是检验他们平等的唯一可能方法?
答案 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);