我有三个表:输入,结果,错误。
输入table
:
'input', 'CREATE TABLE `input` (\n `name` varchar(500) NOT NULL,\n PRIMARY KEY (`name`),\n UNIQUE KEY `domain_UNIQUE` (`name`)\n) ENGINE=InnoDB DEFAULT CHARSET=latin1'
results
表:
'results', 'CREATE TABLE `results` (\n `name` varchar(1000) NOT NULL,\n `no` varchar(500) DEFAULT NULL,\n `description` varchar(500) DEFAULT NULL,\n `version` varchar(500) DEFAULT NULL,\n `ext` longtext,\n PRIMARY KEY (`name`),\n UNIQUE KEY `domain_UNIQUE` (`name`)\n) ENGINE=InnoDB DEFAULT CHARSET=latin1'
errors
表:
'erros', 'CREATE TABLE `erros` (\n `error` varchar(500) DEFAULT NULL,\n `name` varchar(1000) NOT NULL,\n `code` longtext,\n PRIMARY KEY (`name`),\n UNIQUE KEY `ip_UNIQUE` (`name`)\n) ENGINE=InnoDB DEFAULT CHARSET=latin1'
我想查询name
表中存在的input
字段,但results
而不是errors
表中不存在的字段。
我尝试使用NOT IN
来构建查询,但是它会永远持续下去,然后mysql工作台崩溃。请注意,name
和errors
表中的results
字段始终是name
中存在的input
,但具有固定的xxx
字首。
这是我的尝试:
选择input
。name
来自myscheme
。input
,myscheme
。results
,myscheme
。erros
不存在concat('xxx',input
。name
)的地方(从results
。name
中选择myscheme
。results
)
和concat('xxx',input
。name
)不在(从erros
。name
中选择myscheme
。erros
);
能帮我查询一下name
内的input
字段,而不是results
内和errors
内的字段。
答案 0 :(得分:1)
我会使用not exists
:
select i.name
from myschee.input i
where not exists (select 1 from myscheme.results r where r.name = concat('xxx', i.name)) and
not exists (select 1 from myscheme.errors e where e.name = concat('xxx', i.name));
注意:
'xxx'
连接到名称,但是大概您有理由。inputs
中选择,因此该表应该是FROM
子句中的唯一表。NOT EXISTS
胜过NOT IN
,因为即使子查询返回NOT EXISTS
值,NULL
也能正常工作(按预期)。WHERE
子句中尝试的逻辑。这似乎是一个AND
条件,并且在两个表上进行了比较。