Я думаю, что лучшее, что можно сделать в такой ситуации, это разбить его на более мелкие запросы и затем объединить их вместе.
Первое, что вы хотите сделать, это:
Специфика заключается в том, что я обязательно получаю query_results с автором, который не указан ни в одном из customer_email_id, где days_since_sending будет меньше 60 дней
Это может выглядеть примерно так:
-- Query A
SELECT DISTINCT q.author FROM query_results q
WHERE q.author NOT IN (
SELECT c.author FROM customers_emails c
WHERE c.days_since_sending < 60
)
AND q.query_id = 1
Появится список авторов (с удаленными дубликатами), у которых не было электронного письма за последние 60 дней, которое появляется для данного идентификатора запроса.Ваше следующее требование:
Мне нужно, чтобы в столбце был указан максимальный размер email_nb, отправленного Джону customer_id = 12 и query_id = 1 ДАЖЕ, если он был отправлен более 60 дней назад
Этот запрос может выглядеть следующим образом:
-- Query B
SELECT c.query_result_id, c.author, MAX(c.email_nb) as max_email_nb
FROM customers_emails c
LEFT JOIN query_results q ON c.author = q.author
WHERE c.customer_id = 12
AND q.query_id = 1
GROUP BY c.query_result_id, c.author
Получает максимальный email_nb для каждой комбинации author / query_result, без учета даты вообще.
Единственное, что осталось сделать, - это сократить набор результатов от второго запроса до тех авторов, которые появляются в первом запросе.Есть несколько разных способов сделать это.Например, вы можете ВНУТРИ СОЕДИНИТЬ эти два запроса с помощью author
:
SELECT b.* FROM (
-- Query B
SELECT c.query_result_id, c.author, MAX(c.email_nb) as max_email_nb
FROM customers_emails c
LEFT JOIN query_results q ON c.author = q.author
WHERE c.customer_id = 12
AND q.query_id = 1
GROUP BY c.query_result_id, c.author
) b INNER JOIN (
-- Query A
SELECT DISTINCT q.author FROM query_results q
WHERE q.author NOT IN (
SELECT c.author FROM customers_emails c
WHERE c.days_since_sending < 60
)
AND q.query_id = 1
) a ON a.author = b.author
Вы можете использовать другое предложение NOT IN:
SELECT b.* FROM (
-- Query B
SELECT c.query_result_id, c.author, MAX(c.email_nb) as max_email_nb
FROM customers_emails c
LEFT JOIN query_results q ON c.author = q.author
WHERE c.customer_id = 12
AND q.query_id = 1
GROUP BY c.query_result_id, c.author
) b
WHERE b.author NOT IN (
-- Query A
SELECT DISTINCT q.author FROM query_results q
WHERE q.author NOT IN (
SELECT c.author FROM customers_emails c
WHERE c.days_since_sending < 60
)
AND q.query_id = 1
) a
Скорее всего, есть способы повысить скоростьили уменьшите количество строк кода для этого запроса, но если вам нужно сделать это, теперь у вас есть запрос, который работает, по крайней мере, с которым можно сравнить результаты.