mysql - 从表 A 中删除,其中表 A 中不存在子项且表 B 中不存在子项

标签 mysql sql-delete

我有一个用于简单树分类的传统父/子表和一个用于链接到类别的页面的“页面”表:

    **Table: cat**
    c_id
    c_name
    parent_id

    **Table: page**
    p_id
    page_name
    c_id

我想仅当 cat 表中没有子类别且页表中没有子页面时才执行删除。我知道如何通过先计数和检查来做到这一点。但是,想知道是否可以在单个查询中优雅地实现并获取受影响的行。

我已经尝试过此操作,但它不起作用,因为我认为不允许在删除查询中从目标表中进行选择?

    DELETE 
    FROM cat
    WHERE c_id=x
    AND NOT EXISTS (
    SELECT count( DISTINCT p_id ) as pages                       
    FROM page
    WHERE c_id =x
    )
    AND NOT EXISTS (
    SELECT count( DISTINCT c_id ) as children                       
    FROM cat
    WHERE parent_id =x
    );

最佳答案

即使从连接表中删除,DELETE JOIN 也可以工作。这里我们 LEFT JOIN 来检查是否有任何连接(c2 是可能的父页面,p 是可能的引用页面)

最后我们只删除没有连接的行(即连接返回 NULL);

DELETE c1
FROM cat c1
LEFT JOIN cat c2 
  ON c1.c_id = c2.parent_id
LEFT JOIN page p
  ON c1.c_id = p.c_id
WHERE c2.parent_id IS NULL
 AND p.c_id IS NULL
 AND c1.c_id = 1

An SQLfiddle to test with .

关于mysql - 从表 A 中删除,其中表 A 中不存在子项且表 B 中不存在子项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24468460/

相关文章:

PHP slimframework GET 请求不返回任何内容

php - 检查 MySQL 数据库中的重复用户

mysql - 从 MYSQL 数据库检索已删除的行

sql - 简单的删除查询。最好的指标是什么?

php - PHP 形式的连字符、下划线和字母

php - 使用 mysqli 从 mysql 数据库获取单行

php - 使用 GROUP BY 的 MySQL 查询和使用 ORDER BY 的子查询

sql - 删除表中记录数给定的记录数

sql - 在 Access 2007 中删除多个表中的记录

c# - 需要帮助提高 SQL DELETE 性能