#mysql #sql
#mysql #sql
Вопрос:
У меня есть таблица контактов:
id org_id date1 date2 date3
------------------------------------------------------
1 345 22-01-2020 01-01-2019 NULL
2 567 31-01-2018 NULL 24-05-2019
Я хочу выбрать c.id
where org_id = 354 AND all date columns are (NULL or < DATE_SUB(NOW(),INTERVAL 2 YEAR)
Я не могу получить больше, чем это:
SELECT id FROM contacts
WHERE (cc.crm_organisation_id = 152 AND (cc.last_login IS NULL OR cc.last_login < DATE_SUB(NOW(),INTERVAL 2 YEAR)))
OR (cc.crm_organisation_id = 152 AND (cc.last_login_rip IS NULL OR cc.last_login_rip < DATE_SUB(NOW(),INTERVAL 2 YEAR)))
OR (cc.crm_organisation_id = 152 AND (cc.last_login_ripfa IS NULL OR cc.last_login_ripfa < DATE_SUB(NOW(),INTERVAL 2 YEAR)))
OR (cc.crm_organisation_id = 152 AND (cc.created IS NULL OR cc.created < DATE_SUB(NOW(),INTERVAL 2 YEAR)))
OR (cc.crm_organisation_id = 152 AND (cc.modified IS NULL OR cc.modified < DATE_SUB(NOW(),INTERVAL 2 YEAR)))
Спасибо за любую помощь!
Ответ №1:
Это более простой способ сделать это:
SELECT id
FROM contacts
WHERE org_id = 152
AND GREATEST(
COALESCE(date1, '1000-01-01'),
COALESCE(date2, '1000-01-01'),
COALESCE(date3, '1000-01-01')
) < CURRENT_DATE - INTERVAL 2 YEAR
потому что, если максимум из 3 дат меньше, чем 2 года назад, то все даты меньше, чем 2 года назад.
Комментарии:
1. Я получаю сообщение об ошибке в последней строке: «У вас ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, чтобы найти правильный синтаксис для использования рядом с ‘) < CURRENT_DATE — ИНТЕРВАЛ 2 ГОДА’ в строке 1 Должен ли я установить конкретную дату в строках ОБЪЕДИНЕНИЯ?
2. @BenjaminWhitehouse Проверьте это: dbfiddle.uk /… в моем запросе нет синтаксической ошибки. Вы правильно его используете?
3. @BenjaminWhitehouse отлично, если это сработало, и не забудьте принять ответ, нажав на галочку.
Ответ №2:
Как насчет этого?
select id
from contacts
where crm_organisation_id = 152 and
( (last_login is null or last_login < curdate() - interval 2 year) or
(last_login_ripfa is null or last_login_ripfa < curdate() - interval 2 year) or
(created is null or created < curdate() - interval 2 year) or
(modified is null or modified < curdate() - interval 2 year)
);