У меня возникла проблема с попыткой очистки данных из таблицы MySQL. Проблема в том, что нам нужно использовать таблицу в подзапросе, чтобы определить, что нужно удалить.
DELETE
FROM dates
WHERE event_ref IN (*list of event_refs*)
AND person_ref IN (
SELECT person.person_ref
FROM person
JOIN dates ON dates.person_ref = person.person_ref AND dates.event_ref = 14
WHERE dates.date < CURDATE()
)
Subquery
дает всем людям с датой раньше, чем сегодня. Список событий refs - это список событий, которые мы хотим удалить, и который исключает event_ref = 14
Обработка запроса как SELECT возвращает все, что мы хотим удалить, но MySQL жалуется при попытке использовать удаление.
Я действительно не хочу идти в длину, создавая представление для ссылки в вышеупомянутый запрос, поскольку очистка является одноразовым событием
Сначала сократите запрос. Вы можете избавиться от person
таблицы здесь; вы ничего не делаете с этим.
DELETE
FROM dates
WHERE event_ref IN (*list of event_refs*)
AND person_ref IN
(
SELECT person_ref
FROM dates
WHERE event_ref = 14 AND date < CURDATE()
);
Теперь MySQL не любит напрямую обращаться к таблице, из которой она удаляется. В MySQL вам придется обернуть таблицу в псевдоподзапросе:
DELETE
FROM dates
WHERE event_ref IN (*list of event_refs*)
AND person_ref IN
(
SELECT person_ref
FROM (SELECT * FROM dates) d
WHERE event_ref = 14 AND date < CURDATE()
);
Вы можете использовать подзапрос:
DELETE
FROM dates
WHERE event_ref IN (*list of event_refs*)
AND person_ref IN (SELECT person_ref FROM (
SELECT person.person_ref
FROM person
JOIN dates ON dates.person_ref = person.person_ref AND dates.event_ref = 14
WHERE dates.date < CURDATE()) sub
)
Вы можете использовать внутреннее соединение в подзапросе для той же таблицы
DELETE dates FROM dates
INNER JOIN (
SELECT person.person_ref
FROM person
JOIN dates ON dates.person_ref = person.person_ref AND dates.event_ref = 14
WHERE dates.date < CURDATE()) sub
) t on t.person_ref = dates. person_ref
AND event_ref IN (*list of event_refs*)