SQL select id, где id отсутствует в записи с несколькими идентификаторами в другой таблице - PullRequest
0 голосов
/ 05 июня 2018

У меня есть две таблицы в базе данных, и я хочу выбрать все идентификаторы из первой таблицы, где этот идентификатор отсутствует в записи второй таблицы.

Например:

  • Таблица1 содержит столбцы (ID, Имя) и примеры данных: (1, «Джон»), (2, «Петр»), ...,(333, «Мэри»), (433, «Роза»)
  • В таблице 2 есть столбцы (ID_not_like_Table1, ID) и примеры данных: (123, «1; 2; 433»), (124, «2; 433 "), (125," 1; 433 "), (126," 1; 433 ")

В этом случае идентификатор 333 должен быть возвращен, поскольку 333 никогда не находится в идентификаторах из таблицы 2

Итак, как мне создать запрос SQL, чтобы я мог получить строку с идентификатором из Таблицы1, которого нет в идентификаторах из Таблицы2?

Если это можно сделать в одном запросе, я могу сделатьподробнее в php-файле.

PS: эта тема вдохновлена ​​этой темой: SQL-запрос для поиска записи с идентификатором, которого нет в другой таблице

Заранее спасибона любую помощь

1 Ответ

0 голосов
/ 05 июня 2018

Не хранить списки идентификаторов в строке.Это не правильно.Неправильно.Неправильно.Неправильно.Почему?

  • Числа должны храниться в виде чисел, а не строк.
  • SQL имеет очень плохие функции обработки строк.
  • Должны быть правильно объявлены отношения внешнего ключа.
  • Механизмы SQL не могут оптимизировать строковые операции.
  • SQL имеет эту действительно великолепную структуру данных для хранения списков.Это называется таблица .

Тем не менее, иногда мы застряли с очень, очень, очень плохими решениями других людей.Есть подходы, чтобы принять.Вы не указали свою базу данных, но в стандартном SQL вы можете сделать:

select t1.*
from table1 t1
where not exists (select 1
                  from table2 t2
                  where ';' || t2.ids || ';' like '%;' || cast(t1.id as varchar(255)) || ';%';

Это предлагается только в качестве обходного пути, когда вы не можете исправить модель данных.

РЕДАКТИРОВАТЬ:

MySQL использует функцию concat().И, возможно, вы захотите принять во внимание неожиданные пробелы:

select t1.*
from table1 t1
where not exists (select 1
                  from table2 t2
                  where concat(';', replace(t2.ids, ' ', ''), ';') like concat('%;', cast(t1.id as varchar(255)), ';%');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...