sql - 需要查询帮助

标签 sql mysql

您好,有 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/

相关文章:

mysql - 如何在 MySQL 中加入第一个有序匹配?

php - 我是否正确查询 MySQL 表?

mysql - 无法使用phpmyadmin连接到mysql远程服务器

mysql - 仅选择具有其他唯一列的特定记录的最高值?

mysql - 如何替换 SELECT 查询中重复记录的列?

c# - 当我的 MVC Controller 中没有数据时,尝试读取无效

mysql - 从单个查询更新大表时,SQL NOW() 函数是动态的还是静态的?

mysql - 雪花图和多对多关系

php - 来自具有相同列名的两个表的数据

Php mysql,从 3 个不同的数组(一个长度不同)插入数据