Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Xóa một hàng có liên kết bên trong

Cân nhắc chạy DELETE...INNER JOINDELETE với các điều kiện truy vấn con và tránh lặp lại tìm nạp truy vấn PHP với if/else như logic có vẻ như sau:

  1. xóa bất kỳ hồ sơ và nhận xét nào của người bình luận nếu họ chỉ có một nhận xét
  2. chỉ xóa nhận xét của người bình luận nếu người đó có nhiều (tức là nhiều hơn một) nhận xét.

Và có, cả ba DELETE có thể chạy cùng lúc trên tất cả các id vì các điều kiện loại trừ lẫn nhau được đặt giữa hai điều kiện đầu tiên và điều kiện cuối cùng. Do đó, hai đầu tiên ảnh hưởng đến hàng hoặc cuối cùng ảnh hưởng đến hàng mỗi lần lặp. Một (các) không bị ảnh hưởng sẽ xóa không hàng nào khỏi một trong hai bảng.

Ngoài ra, đơn giản các bản ghi sẽ bị xóa trước vì bảng này có thể có ràng buộc khóa ngoại với commentor do mối quan hệ một-nhiều của nó. Cuối cùng, bên dưới giả định nhận xét id được chuyển vào vòng lặp (không phải người bình luận id).

PHP (sử dụng tham số hóa, giả sử $ conn là một đối tượng kết nối 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();
}

Ngoài ra, đối với cách tiếp cận DRY-er, hãy lặp lại các câu lệnh SQL trong một mảng:

$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. Kết quả nối SQL thành một đối tượng trong codeigniter

  2. MySQL:Làm thế nào để đặt lại hoặc thay đổi mật khẩu gốc của MySQL?

  3. Chuỗi RODBC bị cắt ngắn

  4. Tại sao mysql_escape_string rất không được khuyến khích?

  5. Làm cách nào để CẬP NHẬT một hàng trong bảng hoặc CHÈN hàng nếu nó không tồn tại?