DELETE...INNER JOIN
running चलाने पर विचार करें और DELETE
सबक्वेरी कंडीशनल के साथ और PHP क्वेरी से बचें if/else
. के साथ लूपिंग प्राप्त करें जैसा कि तर्क निम्नलिखित प्रतीत होता है:
- किसी भी टिप्पणीकार की प्रोफ़ाइल और टिप्पणियों को हटा दें यदि उसके पास केवल एक टिप्पणी है
- केवल टिप्पणीकार की टिप्पणियों को हटाएं यदि उसके पास एकाधिक (यानी, एक से अधिक) टिप्पणियां हैं।
और हाँ, तीनों DELETE
सभी आईडी में एक ही समय में चलाया जा सकता है क्योंकि पहले दो और अंतिम के बीच परस्पर अनन्य शर्तें रखी जाती हैं। इसलिए, या तो पहले दो पंक्तियों को प्रभावित करते हैं या अंतिम एक प्रति पुनरावृत्ति पंक्तियों को प्रभावित करता है। अप्रभावित व्यक्ति किसी भी तालिका से शून्य पंक्तियों को हटा देगा।
साथ ही, सरल टिप्पणियां रिकॉर्ड पहले हटा दिए जाते हैं क्योंकि इस तालिका में टिप्पणीकर्ता . के साथ एक विदेशी कुंजी बाधा हो सकती है इसके एक-से-अनेक संबंध के कारण। अंत में, नीचे टिप्पणी माना जाता है आईडी को लूप में पास किया जाता है (टिप्पणीकर्ता नहीं आईडी)।
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();
}
}