如何查询记录出现在一个表中,而不出现在其他两个表中

时间:2018-11-17 18:06:33

标签: mysql sql database join

我有三个表:输入,结果,错误。

输入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工作台崩溃。请注意,nameerrors表中的results字段始终是name中存在的input,但具有固定的xxx字首。

这是我的尝试:

选择inputname 来自myschemeinputmyschemeresultsmyschemeerros 不存在concat('xxx',inputname)的地方(从resultsname中选择myschemeresults) 和concat('xxx',inputname)不在(从errosname中选择myschemeerros);

能帮我查询一下name内的input字段,而不是results内和errors内的字段。

1 个答案:

答案 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条件,并且在两个表上进行了比较。