Как сделать запрос записей в одной таблице, но не в двух других таблицах - PullRequest
0 голосов
/ 17 ноября 2018

У меня есть три таблицы: ввод, результаты, ошибки.

ввод 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) нетin (выберите erros. name из myscheme. erros);

Не могли бы вы помочь мне запросить поле name, если оно существует в input, но не в results и не в errors.

1 Ответ

0 голосов
/ 17 ноября 2018

Я бы использовал 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 условие со сравнениями в двух таблицах.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...