【问题标题】:delete results of a select with a JOIN使用 JOIN 删除选择的结果
【发布时间】:2015-05-04 21:48:09
【问题描述】:

我有一张users 的表格,可能有也可能没有上传photos。我想删除所有没有有照片的用户。现在我可以得到没有这样照片的用户:

SELECT a.id FROM users a
LEFT JOIN images b
ON a.id = b.user_id
WHERE b.user_id is null

但是,我对如何实际执行删除操作有点困惑。

这不起作用:

DELETE FROM users c WHERE c.id IN ( SELECT a.id FROM users a
    LEFT JOIN images b
    ON a.id = b.user_id
    WHERE b.user_id is null
    )

这也不是:

DELETE FROM users a
LEFT JOIN images b
ON a.id = b.user_id
WHERE b.user_id is null

删除 JOIN 结果的正确方法是什么?

【问题讨论】:

    标签: mysql sql join


    【解决方案1】:

    我猜你的第二个例子失败了,因为它引用了子查询中的表,但它实际上不需要:

    DELETE FROM users c WHERE c.id NOT IN ( SELECT DISTINCT user_id FROM images);
    

    否则,我会这样做:

    DELETE FROM users 
    USING users AS u LEFT JOIN images AS i ON u.id = i.user_id 
    WHERE i.user_id IS NULL;
    

    【讨论】:

      【解决方案2】:
      DELETE users
      WHERE NOT EXISTS (
          SELECT 1
          FROM images i
          WHERE users.user_id = i.user_id)
      

      【讨论】:

      • 我从来都不喜欢相关子查询。假设可行,它不会为每一行用户单独运行子选择吗?
      • 查询处理器足够智能,可以进行连接 - 它是查询处理 101,所以我认为大多数数据库服务器都会解决这个问题。
      【解决方案3】:

      您几乎可以使用带连接的删除查询,但需要提供要从中删除的表。

      试试这个:

      delete a.* from users a left join images b on a.user_id=b.user_id where b.user_id is null;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-26
        • 2016-06-09
        • 2020-02-27
        • 1970-01-01
        • 2015-03-01
        • 2011-05-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多