Условное соединение SQL на основе Count и удаление

#mysql #sql #count #inner-join #sql-delete

#mysql #sql #количество #внутреннее соединение #sql-удалить

Вопрос:

Я пытаюсь найти все строки в таблице ‘wpi9_pc_products’, которые содержат менее 3 записей в таблице ‘wpi9_term_relationships’, чтобы я мог удалить их из обеих.

Перед тем, как начать с нуля, я хочу убедиться, что я извлекаю правильные строки для удаления, используя этот запрос:

 SELECT * FROM `wpi9_pc_products` INNER JOIN wpi9_term_relationships ON 
wpi9_pc_products.id_product=wpi9_term_relationships.object_id GROUP BY 
wpi9_term_relationships.object_id HAVING COUNT(*) < 3
  

Тем не менее, я застрял здесь, пытаясь найти правильный способ условного объединения двух таблиц на основе count.

Мой SQL очень, очень ржавый, поэтому любая помощь будет принята с благодарностью!

Ответ №1:

Если я правильно понимаю, у вас есть родительская / дочерняя связь между продуктами и таблицей взаимосвязей. Я бы рекомендовал установить ограничение внешнего ключа для дочерней таблицы, которое ссылается на родительскую таблицу, например:

 alter table wpi9_term_relationships
    add constraint fk_product_id
    foreign key (object_id)
    references wpi9_pc_products(id_product)
    on delete cascade;
  

Затем вы можете просто удалить записи из родительской таблицы; on delete cascade предложение гарантирует, что дочерние записи будут автоматически удалены:

 delete p
from wpi9_pc_products p
where (select count(*) from wpi9_term_relationships r where r.object_id = p.id_product) < 3
  

Комментарии:

1. Спасибо за предложение. Разве в начальном запросе не должно быть указано references wpi9_pc_products(id_product)

2. @FarhadD: действительно. Теперь, когда вы исправили опечатку в своем вопросе, становится понятнее, каково имя столбца.