#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: действительно. Теперь, когда вы исправили опечатку в своем вопросе, становится понятнее, каково имя столбца.