Проблема с удалением MySQL и внутренним соединением

#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);