Привет, у меня есть 2 таблицы, организованные таким образом:
table_users
|user_id|username|
table_products
|product_id|user_id|
Теперь у меня есть некоторые сиротские записи в 'table_products'. С помощью этого запроса я проверю, сколько у меня продуктов:
SELECT count(product_id) FROM table_products
Этот запрос показывает мне количество продуктов, связанных с пользователями:
SELECT p.product_id, u.username
FROM table_products AS p
JOIN table_users AS u ON u.user_id = p.user_id
Мне нужен запрос, который позволяет мне выбирать и удалять все продукты-сироты. Кто-нибудь может мне помочь?
DELETE FROM TABLE_PRODUCTS
WHERE user_id NOT IN (SELECT u.user_id
FROM TABLE_USERS u)
DELETE FROM TABLE_PRODUCTS
WHERE NOT EXISTS (SELECT NULL
FROM TABLE_USERS u
WHERE u.user_id = TABLE_PRODUCTS.user_id)
DELETE TABLE_PRODUCTS
FROM TABLE_PRODUCTS p
LEFT JOIN TABLE_USERS u ON u.user_id = p.user_id
WHERE u.user_id IS NULL
Если параметр TABLE_PRODUCTS.user_id
является нулевым, значения NOT IN и NOT EXISTS являются более эффективными. В противном случае LEFT JOIN является наиболее эффективным выбором в MySQL, когда сравниваемые столбцы не могут быть нулевыми.
Проверьте и дважды проверьте, что вы выбираете правильные строки для удаления перед выполнением действия путем замены "DELETE FROM" для "SELECT * FROM". Кроме того, если вы используете таблицы InnoDB, инкапсулируйте DELETE в транзакцию, чтобы при необходимости использовать ROLLBACK
.
Предупреждение. Я не несу ответственности за данные, удаленные с помощью этого запроса. Всегда проверяйте тестовую базу данных перед выполнением производственных данных.
DELETE p
FROM table_products AS p
LEFT JOIN table_users AS u
USING (user_id)
WHERE u.user_id IS NULL