我创建了两个表,simplecomments 和 commentors,并使用 INNER JOIN
连接它们。
- Simplecomments 是每个评论者的详细信息,包括他们的评论、reg_date、commentorid 等...
- Commentors 是评论者的个人信息,包括以下几列:id、name、email..
我已经成功加入它们,但是我发现很难从加入的表中删除。
我想做成这样的逻辑:
如果评论者的最后一行名为——比方说 A—— 然后从表中删除他/她的评论详细信息和 A 他/她自己。
Else如果A评论了很多次,有不同的评论,删除他/她的评论细节,但保留他/她的个人信息,因为A在那里有其他评论。
我是这样实现的:
if (!empty($_POST["delete"]))
{
foreach ($_POST["delete"] as $key => $value)
{
$resultid = $conn->query("SELECT commentorid FROM `simplecomments` WHERE id=".$value);
$rowid = $resultid->fetch_assoc();
$outputdelete = $rowid["name"] . " has been deleted" . "<br>";
$deletedname = $deletedname.$outputdelete;
$RES = mysql_num_rows($resultid);
$counter = 0;
while($row = $RES)
{
//IF IT'S LAST ROW, DELETE COMMENTOR AND HIS/HER COMMENTDETAILS
if(++$counter == $results) {
$resultid = $conn->query("DELETE FROM `commentor`");
}
//ELSE JUST DELETE HIS/HER COMMENTDETAILS, LET HIS/HER INFO REMAIN
else{
$resultid = $conn->query("DELETE FROM `simplecomments` WHERE id=".$value);
}
}
}
}
但是代码将不起作用。我得到一个错误:
Warning: mysql_num_rows() expects parameter 1 to be resource [..]...
最佳答案
考虑使用子查询条件运行 DELETE...INNER JOIN
和 DELETE
并避免以 if/else
为逻辑的 PHP 查询获取循环似乎是以下内容:
- 删除任何评论者的个人资料和评论,如果他/她只有一条评论
- 如果评论者有多个(即不止一个)评论,则只删除他/她的评论。
是的,所有三个 DELETE
都可以在所有 id 上同时运行,因为互斥条件位于前两个和最后一个之间。因此,前两个影响行或最后一个影响每次迭代的行。未受影响的人将从任一表中删除零行。
此外,simplecomments 记录首先被删除,因为该表由于其一对多关系可能具有带有commentor 的外键约束。最后,下面假设 comment id 被传递到循环中(不是 commentor id)。
PHP (使用参数化,假设 $conn 是一个 mysqli 连接对象)
foreach ($_POST["delete"] as $key => $value) {
// DELETE COMMENTS AND THEN PROFILE FOR COMMENTORS WITH ONE POST
$sql = "DELETE FROM `simplecomments` s
WHERE s.id = ?
AND (SELECT COUNT(*) FROM `simplecomments` sub
WHERE sub.commentorid = s.commentorid) = 1";
$stmt = $conn->prepare($sql);
$stmt->bind_param("i", $value);
$stmt->execute();
$stmt->close();
$sql = "DELETE c.* FROM `simplecomments` c
INNER JOIN `simplecomments` s ON s.commentorid = c.id
WHERE s.id = ?
AND (SELECT COUNT(*) FROM `simplecomments` sub
WHERE sub.commentorid = s.commentorid) = 1";
$stmt = $conn->prepare($sql);
$stmt->bind_param("i", $value);
$stmt->execute();
$stmt->close();
// DELETE COMMENTS FOR COMMENTORS WITH MULTIPLE POSTS BUT KEEP PROFILE
$sql = "DELETE FROM `simplecomments` s
WHERE s.id = ?
AND (SELECT COUNT(*) FROM `simplecomments` sub
WHERE sub.commentorid = s.commentorid) > 1";
$stmt = $conn->prepare($sql);
$stmt->bind_param("i", $value);
$stmt->execute();
$stmt->close();
}
或者,对于 DRY-er 方法,在数组中循环 SQL 语句:
$sqls = array(
0 => "DELETE FROM `simplecomments` s WHERE s.id = ? AND (SELECT COUNT(*) FROM `simplecomments` sub WHERE sub.commentorid = s.commentorid) = 1",
1 => "DELETE c.* FROM `simplecomments` c INNER JOIN `simplecomments` s ON s.commentorid = c.id WHERE s.id = ? AND (SELECT COUNT(*) FROM `simplecomments` sub WHERE sub.commentorid = s.commentorid) = 1",
2 => "DELETE FROM `simplecomments` s WHERE s.id = ? AND (SELECT COUNT(*) FROM `simplecomments` sub WHERE sub.commentorid = s.commentorid) > 1"
);
foreach ($_POST["delete"] as $key => $value) {
foreach($sqls as $sql) {
$stmt = $conn->prepare($sql);
$stmt->bind_param("i", $value);
$stmt->execute();
$stmt->close();
}
}
关于php - 使用内部连接删除行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47238602/