【问题标题】:Delete data from table that is not exist in other table从表中删除其他表中不存在的数据
【发布时间】:2016-12-16 05:28:38
【问题描述】:

我有两个名为 ClassLevels 的表。 我想从与级别的 c_id 不匹配的类中删除 c_id。我可以通过这样的查询来做到这一点:

DELETE FROM class WHERE NOT EXISTS (SELECT * FROM levels WHERE levels.c_id=class.c_id)

但我想使用这样的链接进行查询:

DELETE FROM class WHERE NOT EXISTS (SELECT * FROM levels WHERE levels.c_id=class.c_id) WHERE c_id = '$_GET['del_id']';

但我无法做到这一点。请帮助我。

【问题讨论】:

  • 我不清楚最后的附加 WHERE 条件应该限制什么。你能详细说明一下吗?
  • 你有脸书或whatsap吗?让我给你发照片。快照
  • 大声笑...也许推迟。你认为额外的WHERE 术语c_id = '$_GET['del_id']' 应该做什么?
  • 别笑,我是php新手,所以问。
  • 不...我在嘲笑 Facebook 部分...我以前从未在这里看到过这个问题。我不认为你的问题真的是一个 PHP 问题,而是你能够表达你想要在查询中发生的逻辑。

标签: php mysqli


【解决方案1】:

您需要分两步完成此操作

if (!isset($_GET['del_id'])) {
  die("Invalid ID specified.");
}
$c_id_get = '$_GET['del_id']'


$sql = "DELETE FROM class WHERE NOT EXISTS (SELECT * FROM levels WHERE levels.c_id=class.c_id  && c_id='{$c_id_get}')";
mysqli_query($connection,$sql);

【讨论】:

    【解决方案2】:

    我可能会通过classlevels 表之间的删除连接查询来执行此操作。那么删除记录的标准是双重的。它必须与您的 PHP 查询参数匹配,并且它也不能出现在 levels 表中。 class 中不存在于 levels 中的记录的标记是 LEFT JOIN 在这种情况下将具有 NULL 连接列(因此 IS NULL 检查如下所示)。

    DELETE t1
    FROM class t1
    LEFT JOIN levels t2
        ON t1.c_id = t2.c_id
    WHERE t1.c_id = $_GET['del_id'] AND          -- matches correct class ID
          t2.c_id IS NULL                        -- and not present in 'levels' table
    

    更新:

    从您最近的 cmets 看来,您真正在寻找的是对 class 表的级联删除:

    ALTER TABLE levels
    ADD CONSTRAINT `fk_id`
    FOREIGN KEY (c_id)
    REFERENCES `class` (`c_id`)
    ON DELETE CASCADE
    

    添加此约束后,使用删除记录从class 删除记录 也将删除levels 中指向class 中记录的所有记录。

    【讨论】:

    • @shinzu 对不起,应该是DELETE t1 FROM class t1 ... 请再试一次
    • 它说的是意外的令牌 t1
    • 我认为你的 PHP 代码有一些问题。此查询应直接在 MySQL 中运行而不会出现问题。
    • @shinzu 让我们让它在 PHP 中工作。我看到的第一个潜在问题是$_GET 术语。您需要确保正确使用引号。你做到了吗?
    • 它完成了,现在你想帮助我,如果行存在则表示无法删除,如果不存在则表示已删除
    【解决方案3】:

    NOT EXISTS 的子查询应该返回一个布尔值,并且应该像这样优化 php 代码。

    $sql = 'DELETE FROM `class`
        WHERE NOT EXISTS (
            SELECT 1 FROM `levels` 
                WHERE `levels`.`c_id` = ' . (int) $_GET['del_id'] . '
        )
    ;'
    

    你也可以使用NOT IN

    $sql = 'DELETE FROM `class`
        WHERE `class`.`c_id` NOT IN (
            SELECT `levels`.`c_id` FROM `levels` 
                WHERE `levels`.`c_id` = ' . (int) $_GET['del_id'] . '
        )
    ;'
    

    注意:不要直接在 SQL 中使用请求参数,对于 id,只需将值解析为 int,对于字符串或其他应使用 mysqli_real_escape_string 的值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-01
      • 2021-05-26
      • 1970-01-01
      • 2021-03-17
      • 1970-01-01
      相关资源
      最近更新 更多