php - 使用准备好的语句在一个查询中从不同的表中删除
问题描述
我想在一个表中删除具有指定值(非唯一)的多条记录,并使用准备好的语句在另一个表中删除具有相同指定值(唯一)的记录。这是我得到的,
$stmt = $conn->prepare("DELETE FROM Books WHERE Genre_ID=? AND FROM Library WHERE Genre_ID=?");
$stmt->bind_param("ii", $genreID, $genreID);
查询的目的是通过 ID 从 Library 表中删除指定的 Genre,当然,从 Books 表中删除具有该 ID 的所有书籍。
解决方案
这最好用两条语句来处理……一个从书中删除,另一个从库中删除。
要在单个语句中完成此操作,我们可以使用连接操作。但是“缺失”行存在问题。
我的建议:
首先编写一个 SELECT 语句,对其进行测试,然后将其转换为一个 DELETE 语句。
SELECT b.*
, l.*
FROM `Books` b
JOIN `Library` l
ON l.genre_id = b.genre_id
WHERE b.genre_id = ?
但是,如果 Books 和 Library 中都没有至少一行具有匹配的genre_id,则此语句不会返回任何行。
我们可以通过外连接部分解决这个问题。
SELECT b.*
, l.*
FROM `Library` l
LEFT
JOIN `Books` b
ON b.genre_id = l.genre_id
WHERE l.genre_id = ?
如果图书馆中至少有一行具有指定的genre_id,我们将获得具有相同genre_id 的所有书籍。但如果库中没有匹配的行,它不会返回任何行。
并且 MySQL 不支持完全外部连接,所以这就是我们所能得到的。我们可以将 Library 或 Books 设为驱动表……我们可以处理一个表或另一个表中的“缺失行”。
编辑
作为一个丑陋的解决方法
SELECT b.*
, l.*
FROM ( SELECT rb.genre_id
FROM Books rb
WHERE rb.genre_id = ?
GROUP BY rb.genre_id
UNION
SELECT rl.genre_id
FROM Library rl
WHERE rl.genre_id = ?
GROUP BY rl.genre_id
) r
LEFT
JOIN Books b
ON b.genre_id = r.genre_id
LEFT
JOIN Library l
ON l.genre_id = r.genre_id
然后我们可以将其转换为 DELETE 语句,将 SELECT 替换为 DELETE
缺少行问题:
DELETE b.*
, l.*
FROM `Library` l
LEFT
JOIN `Books` b
ON b.genre_id = l.genre_id
WHERE l.genre_id = ?
请注意同样的问题...Books
如果Library
.
编辑
或使用丑陋的解决方法。将 SELECT 转换为 DELETE:
DELETE b.*
, l.*
FROM ( SELECT rb.genre_id
FROM Books rb
WHERE rb.genre_id = ?
GROUP BY rb.genre_id
UNION
SELECT rl.genre_id
FROM Library rl
WHERE rl.genre_id = ?
GROUP BY rl.genre_id
) r
LEFT
JOIN Books b
ON b.genre_id = r.genre_id
LEFT
JOIN Library l
ON l.genre_id = r.genre_id
同样,我建议将此操作作为两个单独的语句执行,一个从 Books 中删除行,另一个从 Library 中删除行。
我怀疑这两个表之间没有外键约束。如果有,执行这些删除的顺序将很重要。
推荐阅读
- java - Java如何将文件对象列表转换为路径对象列表?
- google-cloud-platform - 如何从受 CMEK(客户管理的密钥)保护的 BigQuery 表在 Tableau 中创建数据源?
- javascript - 合并传感器数据数组的最佳方法
- javascript - 如何在没有 jQuery 的情况下在 ngBootstrap 工具提示中制作可滚动内容?
- pandas - 使用熊猫转换十进制纬度和经度的字符串列跳过nan值
- bash - 将 bash 中的行替换为另一个文件中与另一个文件的列匹配的行
- sql - 是否有允许我提取子字符串的 ProstgreSQL 字符串函数
- django - 带有复选框预填充值的 Django-Tables2
- enums - 如何根据它在 lua 中的枚举定义中的位置来选择特定的枚举值?
- c# - 通过 .net 核心中的记录器引用的 serilog 索引对象