Применение переменной MySQL в условии 'NOT IN': решение

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для упрощения работы с NOT IN списка значений в MySQL вы можете использовать подготовленные запросы с переменной, которая содержит значения для исключения:

SQL
Скопировать код
SET @exclude = '1,2,3'; -- Эти числа мы исключаем...
SET @sql_query = CONCAT('SELECT * FROM db_table WHERE column NOT IN (', @exclude, ')');
PREPARE stmt FROM @sql_query;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

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

Кинга Идем в IT: пошаговый план для смены профессии

Динамический подход к использованию NOT IN

Статические решения – это прошлое. Велкам в эру динамичности!

Создаём динамический SQL для работы со списками значений

Когда требуется работать со списком значений, который формируется находу, стоит прийти к использованию динамического SQL:

SQL
Скопировать код
SET @exclude = (SELECT GROUP_CONCAT(id) FROM table WHERE condition); -- Именно так!
SET @query = CONCAT('SELECT * FROM another_table WHERE column NOT IN (', @exclude, ')');
PREPARE stmt FROM @query;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

Применяем FIND_IN_SET() для обработки списков

С помощью функции FIND_IN_SET() можно грамотно обрабатывать списки, разделённые запятыми, не нарушая синтаксис SQL:

SQL
Скопировать код
SET @exclude = '1,3,5'; -- Выбираем нечётные числа
SELECT * FROM table WHERE FIND_IN_SET(column, @exclude) = 0;

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

Имитируем массивы с помощью подзапросов

Как вишенка на торте, предлагаем элегантный способ имитации массивов с помощью подзапросов, структурированных в стиле UNION ALL:

SQL
Скопировать код
SELECT * FROM table WHERE column NOT IN (
  SELECT value FROM (SELECT 1 AS value UNION ALL SELECT 2 UNION ALL SELECT 3) AS subquery
);

Вот это да, как волшебство!

Работаем со сложными форматами списков

Управляем сложными форматами списков как настоящие мастера SQL.

Подстраиваем CONCAT и разделители под себя

Если в вашем списке используется нестандартный разделитель, команды CONCAT() и REPLACE() придут на помощь!

SQL
Скопировать код
SET @exclude = '1|2|3'; -- Это особые исключения!
SET @formatted_exclude = REPLACE(@exclude, '|', '\',\'');
SET @query = CONCAT('SELECT * FROM table WHERE column NOT IN (\'', @formatted_exclude, '\')');

Применяем NOT LIKE для обеспечения безопасности кода

Имеется список значений, разделённых вертикальными чертами? Просто используйте NOT LIKE:

SQL
Скопировать код
SET @exclude = '%|1|%|2|%|3|%'; -- Значения для исключения разделены процентами
SELECT * FROM table WHERE column NOT LIKE @exclude;

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

Лучшие практики для идеального кода

Соблюдение принципов совместимости с MySQL может оказаться спасительным в деле непредвиденных обстоятельств. Не позволяйте проблемам совместимости препятствовать вашей работе.

Проверенные решения: Большое количество положительных отзывов — это ваш личный аплодисменты зрительного зала при просмотре ваших трудов. Принятый ответ — это награда высшей категории в мире программирования!

Приведение примеров запросов: Обращайтесь к ним как к части практического дополнения ваших программистских приключений!

Визуализация

Рассмотрим эффект оператора NOT IN в MySQL на простом примере:

Все гости: [👩‍💼, 👨‍🏭, 👨‍🍳, 👨‍🔬, 👨‍💻, 👻] Нежелательные гости: [👨‍🔬, 👨‍💻]

Выполняем запрос:

mysql
Скопировать код
SELECT * FROM guests WHERE guest NOT IN ('👨‍🔬', '👨‍💻');

В результате нашего выбора:

🎉 Гости на вечеринке: [👩‍💼, 👨‍🏭, 👨‍🍳, 👻]

Полезные материалы

  1. MySQL :: Справочник MySQL 8.0 :: 15.2.15 Подзапросы
  2. MySQL :: Справочник MySQL 8.0 :: 14.4.2 Функции и операторы сравнения
  3. sql – Как выбрать записи, отсутствующие в другой таблице – Stack Overflow
  4. sql – Сравнение NOT IN и NOT EXISTS – Stack Overflow
  5. Визуальное представление SQL соединений – CodeProject
  6. oracle – Как увеличить производительность моего plsql кода – Форум администраторов баз данных