Есть 2 таблицы "campaigns" и "bl_sites"
campaigns bl_sites
--------- ---------
id camp_id
status site
Данные в таблице "bl_sites". ID кампании и перечень сайтов на которых данную рекламную кампанию показывать не нужно.
Имеем сайт "ajax.loc" Нужно выбрать все кампании и исключить с выборки кампании у которых в блэклисте присутствует сайт "ajax.loc". В данном случае нужно исключить кампанию с ID 21
Такой запрос не работает
SELECT * FROM camps
LEFT JOIN bl_sites ON bl_sites.camp_id = camps.id
WHERE bl_sites.site != 'ajax.loc'
Он просто исключает из объединенной выборки строки, у которых bl_sites.site = 'ajax.loc' Мало того, он вообще не включает в выборку кампании у которых нет сайтов в блеклисте (нет записей в таблице "bl_sites")
Результат:
Такой запрос так же не работает
SELECT * FROM camps
LEFT JOIN bl_sites ON bl_sites.camp_id = camps.id
WHERE bl_sites.site != 'ajax.loc' OR bl_sites.site IS NULL
Он уже включает те кампании у которых нет блеклиста. Но все равно оставляет кампанию с ID 21
Результат:
Наверное я что-то делаю не так. Думал уже плюнуть и добавить текстовое поле в таблицу с кампаниями и писать туда сайты через запятую (для каждой кампании свой БЛ). При выборке использовать LIKE.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей