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

Php 从其他表中不存在的表中删除数据,php,mysqli,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=

我有两个名为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']';

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

您需要分两步完成此操作

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

我可以通过
级别
表之间的delete join查询来实现这一点。删除记录的标准有两个。它必须与PHP查询参数匹配,并且它也不能出现在
levels
表中。
中的记录在
级别
中不存在的标记是
左连接
在这种情况下将具有
NULL
连接列(因此
为NULL
检查如下)

更新:

从您最近的评论中,听起来您真正想要的是
表上的级联删除:

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

添加此约束后,使用delete the record从
中删除记录,并将删除
级别
中指向
中记录的所有记录

对于
不存在的子查询
应该返回一个布尔值,并且php代码应该像这样进行优化

$sql = 'DELETE FROM `class`
    WHERE NOT EXISTS (
        SELECT 1 FROM `levels` 
            WHERE `levels`.`c_id` = ' . (int) $_GET['del_id'] . '
    )
;'
您也可以使用
不在
中:

$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\u real\u escape\u string。

我不清楚最后附加的
条件应该限制在哪里。你能详细说明一下吗?你有facebook或whatsap吗。让我把照片发给你。Snapshotl…也许等一下。你认为额外的
WHERE
term
c_id='$\u GET['del_id']]
应该做什么呢?别笑,我是php新手,所以我在问。不……我在笑Facebook部分……我以前从未见过这样的问题。我不认为你的问题真的是PHP问题,而是你能够表达你希望在查询中出现的逻辑。@shinzu抱歉,应该是
DELETE t1 FROM class t1…
请再试一次。Init说意外的标记t1I我认为你的PHP代码有一些问题。这个查询应该直接在MySQL中运行,没有问题。@shinzu好吧,让我们在PHP中运行它。我看到的第一个潜在问题是
$\u GET
术语。您需要确保正确使用引号。你做了吗?已经做了,现在你愿意帮我吗,如果行存在,它说它不能被删除,如果没有,它说它被删除了
$sql = 'DELETE FROM `class`
    WHERE `class`.`c_id` NOT IN (
        SELECT `levels`.`c_id` FROM `levels` 
            WHERE `levels`.`c_id` = ' . (int) $_GET['del_id'] . '
    )
;'