Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Usuwanie wiersza ze sprzężeniem wewnętrznym

Rozważ uruchomienie DELETE...INNER JOIN i DELETE z warunkowymi podzapytaniami i unikaj pętli pobierania zapytań PHP za pomocą if/else ponieważ logika wydaje się być następująca:

  1. usuń profil i komentarze dowolnego komentatora, jeśli ma tylko jeden komentarz
  2. usuń tylko komentarze komentującego, jeśli ma on/ona wiele (tj. więcej niż jeden) komentarzy.

I tak, wszystkie trzy DELETE można uruchomić w tym samym czasie dla wszystkich identyfikatorów, ponieważ wykluczające się warunki znajdują się między pierwszymi dwoma a ostatnimi. W związku z tym albo pierwsze dwa wpływają na wiersze, albo ostatni oddziałują na wiersze na iterację. Nienaruszony(e) usunie zero wierszy z obu tabel.

Ponadto proste komentarze rekordy są usuwane jako pierwsze, ponieważ ta tabela może mieć ograniczenie klucza obcego z komentarzem ze względu na relację jeden-do-wielu. Wreszcie poniżej zakładamy komentarz identyfikatory są przekazywane do pętli (nie do komentarza id).

PHP (używając parametryzacji, zakładając, że $conn jest obiektem połączenia 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();
}

Alternatywnie, dla podejścia DRY-er, zapętl instrukcje SQL w tablicy:

$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. PHP/MYSQL JavaScript - Wstaw wartość wiersza pobraną z bazy danych do pola tekstowego za pomocą przycisku

  2. Jak przyciąć czas ze znacznika czasu za pomocą php

  3. JPA Zapisywanie błędnej daty w bazie danych MySQL

  4. skrypt MYSQL do konwersji nazw kolumn na małe litery

  5. Czy PDO ext PHP7 odczytuje cały zestaw wyników do pamięci?