从表中删除其他表中不存在的数据

时间:2016-12-16 05:28:38

标签: php mysqli

我有两个名为 Class Levels 的表。 我想从不与级别的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']';

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

3 个答案:

答案 0 :(得分:0)

您需要分两步完成此操作

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);

答案 1 :(得分:0)

我可能会通过classlevels表之间的删除连接查询来执行此操作。然后删除记录的标准是双重的。它必须与您的PHP查询参数匹配,并且它也不得出现在levels表中。 classlevels中未出现的记录的标记是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

<强>更新

根据您最近的评论,听起来您正在寻找的是class表上的级联删除:

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

添加此约束后,删除记录class中的记录也将删除levels中指向{{1}中记录的所有记录}。

答案 2 :(得分:0)

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的其他内容。