DELETE...INNER JOIN
の実行を検討してください およびDELETE
サブクエリ条件を使用し、if/else
でPHPクエリフェッチのループを回避します ロジックは次のように思われるため:
- コメントが1つしかない場合は、コメント投稿者のプロフィールとコメントを削除します
- コメント投稿者のコメントが複数(つまり、複数)ある場合は、コメント投稿者のコメントのみを削除します。
はい、3つすべてのDELETE
最初の2つと最後の1つの間に相互に排他的な条件が設定されるため、すべてのIDで同時に実行できます。したがって、最初の2つは行に影響するか、最後の1つは反復ごとの行に影響します。影響を受けていないものは、いずれかのテーブルからゼロ行を削除します。
また、簡単なコメント このテーブルにはcommentorとの外部キー制約がある可能性があるため、レコードが最初に削除されます その1対多の関係のため。最後に、以下はコメントを想定しています IDはループに渡されます(コメンターではありません) 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();
}
}