Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Menghapus baris dengan gabungan dalam

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:

  1. hapus profil dan komentar pemberi komentar jika dia hanya memiliki satu komentar
  2. 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();
   }
}



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara memilih sesuatu di MYSQL tanpa memilihnya dua kali jika ada di baris?

  2. Perlu bergabung dengan 2 tabel tetapi kecuali beberapa baris di tabel lain di MySQL

  3. Perbedaan waktu antara per orang antara baris berturut-turut

  4. MySQL menghitung rata-rata bergerak dari N baris

  5. Mencoba mengunggah id pengguna ke basis data, Sesi mengembalikan userid sebagai nol?