2016-07-12 4 views
0

Попытка создать запрос для выбора пользователей, которые не были отправлены по электронной почте в рассылку новостей, когда время выписки. В таблице mail_log фиксируются записи из 3 разных списков рассылки и сохраняется журнал в течение последних 4-5 недель - другими словами, для каждого подписчика должно быть несколько записей журнала.Выбор пользователей, которые не отправили информационный бюллетень

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

mail_log 
+--------+------------+-------------+------------+---------+ 
| log_id | send_date | location_id | mailing_id | list_id | 
+--------+------------+-------------+------------+---------+ 
location_id is which mailing list 
mailing_id is the specific newsletter 
list_id is the subscriber's id in the mailing list 

mail_list 
+---------+-------+-------+-------+ 
| list_id | fname | lname | email | 
+---------+-------+-------+-------+ 

Я попробовал этот запрос:

SELECT mail_list.* 
FROM mail_list 
LEFT JOIN mail_log ON mail_log.list_id = mail_list.list_id 
WHERE mail_log.send_date = '2016-07-12' 
AND mail_log.location_id = '2' 
AND mail_log.list_id IS NULL` 

Запрос возвращает 0 результатов, но успешный запрос должен вернуть около 700 результатов.

+0

Да, бесстыдная рекламная возможность для [Опасности не в] (http://stackoverflow.com/a/32175659) – Drew

+0

Вы также должны выбрать 'mail_log. *' Также - – Zak

+0

Изменить WHERE to AND. Измените окончательный AND на WHERE – Strawberry

ответ

2

Когда вы используете LEFT JOIN, вы должны поместить ограничения на дочернюю таблицу в пункт ON. В противном случае, когда вы проверите эти поля, вы будете соответствовать только строкам, отличным от NULL, что противоречит тесту AND mail_log.list_id IS NULL.

SELECT mail_list.* 
FROM mail_list 
LEFT JOIN mail_log ON mail_log.list_id = mail_list.list_id 
    AND mail_log.send_date = '2016-07-12' 
    AND mail_log.location_id = '2' 
WHERE mail_log.list_id IS NULL 
+0

Спасибо. Сразу после публикации я обнаружил, что этот запрос работает. SELECT * FROM mail_list WHERE list_id NOT IN (SELECT list_id FROM mail_log WHERE mailing_id = '216') Любая обратная связь по какому запросу лучше? –

+0

Обычные соединения, как правило, лучше, чем 'WHERE IN (SELECT ...)', потому что они лучше используют индексы. Я не знаю из-за относительной производительности 'WHERE NOT IN'. Оцените их. – Barmar

0

SELECT * FROM mail_list WHERE LIST_ID NOT IN (SELECT list_id FROM mail_log WHERE mailing_id = '216')

хуже, потому что с NOT IN, будет использоваться не показатель. Запрос с левым соединением может использовать list_id, send_date AND location_id как возможные индексы для соединения.

Смежные вопросы