sql >> Database teknologi >  >> RDS >> Mysql

Sletning af en række med indre joinforbindelse

Overvej at køre DELETE...INNER JOIN og DELETE med underforespørgselsbetingelser og undgå PHP-forespørgselshentningslooping med if/else da logikken ser ud til at være følgende:

  1. slet enhver kommentators profil og kommentarer, hvis han/hun kun har én kommentar
  2. slet kun kommentatorens kommentarer, hvis han/hun har flere (dvs. mere end én) kommentarer.

Og ja, alle tre DELETE kan køres på samme tid på tværs af alle id'er, da gensidigt udelukkende betingelser er placeret mellem de to første og sidste. Derfor påvirker enten de to første rækker eller den sidste rækker pr. iteration. Den eller de upåvirkede vil slette nul rækker fra begge tabeller.

Også simplecomments poster slettes først, da denne tabel kan have en fremmednøgle-begrænsning med kommentor på grund af dets en-til-mange forhold. Endelig antager nedenfor kommentar id'er sendes til loop (ikke kommentator id).

PHP (ved at bruge parameterisering, forudsat at $conn er et mysqli-forbindelsesobjekt)

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();
}

Alternativt, for en DRY-er tilgang, loop SQL-sætninger i et 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();
   }
}



  1. Oracle SQL:valg fra alle_fanebladskolonner finder ikke eksisterende kolonne

  2. finde værdier ufølsomt med emojis

  3. Sådan fungerer SQLite Count()

  4. Datoen gemmes ikke i Mysql fra Php-registreringsformularen