Нужна помощь с запросом

0

Привет, у меня есть 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

Мне нужен запрос, который позволяет мне выбирать и удалять все продукты-сироты. Кто-нибудь может мне помочь?

Теги:

2 ответа

2

Использование NOT IN:

DELETE FROM TABLE_PRODUCTS 
 WHERE user_id NOT IN (SELECT u.user_id
                         FROM TABLE_USERS u)

Использование NOT EXISTS:

DELETE FROM TABLE_PRODUCTS 
 WHERE NOT EXISTS (SELECT NULL 
                     FROM TABLE_USERS u
                    WHERE u.user_id = TABLE_PRODUCTS.user_id)

Использование LEFT JOIN/IS NULL:

   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

Эффективность (только для MySQL)

Если параметр TABLE_PRODUCTS.user_id является нулевым, значения NOT IN и NOT EXISTS являются более эффективными. В противном случае LEFT JOIN является наиболее эффективным выбором в MySQL, когда сравниваемые столбцы не могут быть нулевыми.

Добавление

Проверьте и дважды проверьте, что вы выбираете правильные строки для удаления перед выполнением действия путем замены "DELETE FROM" для "SELECT * FROM". Кроме того, если вы используете таблицы InnoDB, инкапсулируйте DELETE в транзакцию, чтобы при необходимости использовать ROLLBACK.

1

Предупреждение. Я не несу ответственности за данные, удаленные с помощью этого запроса. Всегда проверяйте тестовую базу данных перед выполнением производственных данных.

DELETE p 
FROM table_products AS p 
LEFT JOIN table_users AS u 
USING (user_id) 
WHERE u.user_id IS NULL

Ещё вопросы

Сообщество Overcoder
Наверх
Меню