#mysql #inner-join
#mysql #внутреннее соединение
Вопрос:
Мне нужно создать запрос для удаления cfc_registration
, который имеет старый cfc_tournament
.
Мой запрос :
delete from cfc_registration
inner join cfc_tournament on cfc_tournament.id = cfc_registration.cfcTournamendId
where cfc_registration.cfcTournamentId = cfc_tournament.id and cfc_tournament.createdAt >= DATE_SUB(NOW(),INTERVAL 1 YEAR);
Проблема :
#1064 - 'inner join cfc_tournament on cfc_tournament.id = cfc_registration.cfcTournamendI' à la line 2
Ответ №1:
Проблема с вашим DELETE FROM
при запуске. Вы должны использовать DELETE t1 FROM table t1
, поскольку вы указываете, что хотите удалить. Это реализовано таким образом в MySQL, потому что вы можете удалять записи из обеих таблиц одновременно.
Я считаю, что это должно сработать:
DELETE t1
FROM cfc_registration t1
INNER JOIN cfc_tournament t2
ON t2.id = t1.cfctournamendid
WHERE
t1.cfctournamentid = t2.id
AND t2.createdat >= date_sub( now(), interval 1 YEAR );
Ответ №2:
Я лично предпочитаю оператор exists, а не подход inner join
delete from cfc_registration
where exists (
select 1 from cfc_tournament
where cfc_tournament.id = cfc_registration.cfcTournamendId
and cfc_tournament.createdAt >= DATE_SUB(NOW(),INTERVAL 1 YEAR)
);
Кстати: для подхода inner join вам не нужно использовать cfc_registration.cfcTournamentId = cfc_tournament.id and
как inner join, так и where. одного достаточно.
delete cfc_registration
from cfc_registration
inner join cfc_tournament
on cfc_tournament.id = cfc_registration.cfcTournamendId
where cfc_tournament.createdAt >= DATE_SUB(NOW(),INTERVAL 1 YEAR);