Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

आंतरिक जुड़ाव के साथ एक पंक्ति को हटाना

DELETE...INNER JOIN running चलाने पर विचार करें और DELETE सबक्वेरी कंडीशनल के साथ और PHP क्वेरी से बचें if/else . के साथ लूपिंग प्राप्त करें जैसा कि तर्क निम्नलिखित प्रतीत होता है:

  1. किसी भी टिप्पणीकार की प्रोफ़ाइल और टिप्पणियों को हटा दें यदि उसके पास केवल एक टिप्पणी है
  2. केवल टिप्पणीकार की टिप्पणियों को हटाएं यदि उसके पास एकाधिक (यानी, एक से अधिक) टिप्पणियां हैं।

और हाँ, तीनों 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();
   }
}



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. एक संख्या तक गिनें x - sql

  2. पीडीओ - 'जबकि' लूप में असोक प्राप्त करें

  3. एक संग्रहित प्रक्रिया के लूप में कर्सर का उपयोग करना

  4. पंक्ति योग (समूह द्वारा) के साथ परिणामसेट की अंतिम पंक्ति में सभी कॉलम मानों का योग प्राप्त करने के लिए SQL क्वेरी

  5. मैसकल:चुनिंदा स्टेटमेंट के भीतर इनलाइन टेबल बनाएं?