Применение переменной MySQL в условии 'NOT IN': решение
Быстрый ответ
Для упрощения работы с NOT IN списка значений в MySQL вы можете использовать подготовленные запросы с переменной, которая содержит значения для исключения:
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;
Такой запрос поможет выбрать записи, исключая динамически создаваемый список значений. Всё удивительно гибко!
Динамический подход к использованию NOT IN
Статические решения – это прошлое. Велкам в эру динамичности!
Создаём динамический 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:
SET @exclude = '1,3,5'; -- Выбираем нечётные числа
SELECT * FROM table WHERE FIND_IN_SET(column, @exclude) = 0;
Эта функция работает как фильтр, отсеивая строки, в которых значение column
совпадает с одним из элементов списка.
Имитируем массивы с помощью подзапросов
Как вишенка на торте, предлагаем элегантный способ имитации массивов с помощью подзапросов, структурированных в стиле UNION ALL
:
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()
придут на помощь!
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
:
SET @exclude = '%|1|%|2|%|3|%'; -- Значения для исключения разделены процентами
SELECT * FROM table WHERE column NOT LIKE @exclude;
Этот метод будет полезен, если символы %
из вашего списка используются как шаблоны, вокруг каждого значения в списке.
Лучшие практики для идеального кода
Соблюдение принципов совместимости с MySQL может оказаться спасительным в деле непредвиденных обстоятельств. Не позволяйте проблемам совместимости препятствовать вашей работе.
Проверенные решения: Большое количество положительных отзывов — это ваш личный аплодисменты зрительного зала при просмотре ваших трудов. Принятый ответ — это награда высшей категории в мире программирования!
Приведение примеров запросов: Обращайтесь к ним как к части практического дополнения ваших программистских приключений!
Визуализация
Рассмотрим эффект оператора NOT IN
в MySQL на простом примере:
Все гости: [👩💼, 👨🏭, 👨🍳, 👨🔬, 👨💻, 👻] Нежелательные гости: [👨🔬, 👨💻]
Выполняем запрос:
SELECT * FROM guests WHERE guest NOT IN ('👨🔬', '👨💻');
В результате нашего выбора:
🎉 Гости на вечеринке: [👩💼, 👨🏭, 👨🍳, 👻]
Полезные материалы
- MySQL :: Справочник MySQL 8.0 :: 15.2.15 Подзапросы
- MySQL :: Справочник MySQL 8.0 :: 14.4.2 Функции и операторы сравнения
- sql – Как выбрать записи, отсутствующие в другой таблице – Stack Overflow
- sql – Сравнение NOT IN и NOT EXISTS – Stack Overflow
- Визуальное представление SQL соединений – CodeProject
- oracle – Как увеличить производительность моего plsql кода – Форум администраторов баз данных