Pertimbangkan untuk menjalankan DELETE...INNER JOIN
dan DELETE
dengan persyaratan subquery dan hindari pengulangan pengambilan kueri PHP dengan if/else
sebagai logika tampaknya sebagai berikut:
- hapus profil dan komentar pemberi komentar jika dia hanya memiliki satu komentar
- Hapus komentar komentator jika dia memiliki beberapa (yaitu, lebih dari satu) komentar.
Dan ya, ketiganya DELETE
dapat dijalankan pada waktu yang sama di semua id karena kondisi yang saling eksklusif ditempatkan di antara dua yang pertama dan yang terakhir. Oleh karena itu, dua yang pertama memengaruhi baris atau yang terakhir memengaruhi baris per iterasi. Yang tidak terpengaruh akan menghapus nol baris dari kedua tabel.
Juga, komentar sederhana catatan dihapus terlebih dahulu karena tabel ini mungkin memiliki batasan kunci asing dengan komentator karena hubungannya satu-ke-banyak. Akhirnya, di bawah ini mengasumsikan komentar id diteruskan ke loop (bukan komentator id).
PHP (menggunakan parameterisasi, dengan asumsi $conn adalah objek koneksi 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();
}
Atau, untuk pendekatan DRY-er, loop pernyataan SQL dalam array:
$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();
}
}