我有两个名为 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']';
但我无法做到这一点。请帮助我。
答案 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)
我可能会通过class
和levels
表之间的删除连接查询来执行此操作。然后删除记录的标准是双重的。它必须与您的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
<强>更新强>
根据您最近的评论,听起来您正在寻找的是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的其他内容。