Cân nhắc chạy DELETE...INNER JOIN
và DELETE
với các điều kiện truy vấn con và tránh lặp lại tìm nạp truy vấn PHP với if/else
như logic có vẻ như sau:
- xóa bất kỳ hồ sơ và nhận xét nào của người bình luận nếu họ chỉ có một nhận xét
- chỉ xóa nhận xét của người bình luận nếu người đó có nhiều (tức là nhiều hơn một) nhận xét.
Và có, cả ba DELETE
có thể chạy cùng lúc trên tất cả các id vì các điều kiện loại trừ lẫn nhau được đặt giữa hai điều kiện đầu tiên và điều kiện cuối cùng. Do đó, hai đầu tiên ảnh hưởng đến hàng hoặc cuối cùng ảnh hưởng đến hàng mỗi lần lặp. Một (các) không bị ảnh hưởng sẽ xóa không hàng nào khỏi một trong hai bảng.
Ngoài ra, đơn giản các bản ghi sẽ bị xóa trước vì bảng này có thể có ràng buộc khóa ngoại với commentor do mối quan hệ một-nhiều của nó. Cuối cùng, bên dưới giả định nhận xét id được chuyển vào vòng lặp (không phải người bình luận id).
PHP (sử dụng tham số hóa, giả sử $ conn là một đối tượng kết nối 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();
}
Ngoài ra, đối với cách tiếp cận DRY-er, hãy lặp lại các câu lệnh SQL trong một mảng:
$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();
}
}