您好,有 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
我需要一个查询来选择和删除所有孤立产品。 有人可以帮助我吗?
最佳答案
使用 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
is nullable, the NOT IN and NOT EXISTS are more efficient选择。否则,LEFT JOIN is the most efficient choice in MySQL when the columns compared can not be null .
附录
在执行操作之前,通过将“DELETE FROM”替换为“SELECT * FROM”,检查并仔细检查您是否选择了正确的行进行删除。此外,如果使用 InnoDB 表 - 将 DELETE 封装在事务中,以便您可以在必要时使用 ROLLBACK
。
关于sql - 需要查询帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3643200/