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

Rắc rối khi xoay quanh truy vấn xóa SQL phức tạp

Bắt đầu bằng cách xác định đăng ký của các khách hàng khác của một đăng ký. Đây là một chế độ xem:

create view groups as 
select   a.Client_id
       , c.Registration_id
from AssociatedClient as a 
join AssociatedClient as b on a.Registration_id = b.Registration_id 
join AssociatedClient as c on b.Client_id = c.Client_id;

Điều đó mang lại cho chúng tôi:

select Client_id
    , min(Registration_id) as first
    , max(Registration_id) as last
    , count(distinct Registration_id) as regs
    , count(*) as pals
from  groups 
group by Client_id;
Client_id   first       last        regs        pals      
----------  ----------  ----------  ----------  ----------
2           2           8           4           5         
3           2           8           4           18        
4           5           5           1           1         
5           2           8           4           5         
7           10          10          1           1         
8           9           9           1           1         

Tất nhiên, bạn không cần xem; nó chỉ để thuận tiện. Bạn chỉ có thể sử dụng một bảng ảo. Nhưng hãy kiểm tra cẩn thận để tự thuyết phục rằng nó tạo ra phạm vi "đăng ký bạn bè" phù hợp cho từng khách hàng. Lưu ý rằng chế độ xem không tham chiếu Registration . Điều đó rất quan trọng vì nó tạo ra kết quả tương tự ngay cả sau khi chúng tôi sử dụng nó để xóa khỏi Registration , vì vậy chúng ta có thể sử dụng nó cho câu lệnh xóa thứ hai.

Bây giờ chúng tôi có một danh sách các khách hàng và "đăng ký bạn bè" của họ. Ngày đăng ký cuối cùng của mỗi người bạn là gì?

select g.Client_id, max(Registration_date) as last_reg
from groups as g join Registration as r
on g.Registration_id = r.Id
group by g.Client_id;
g.Client_id  last_reg  
-----------  ----------
2            2011-10-14
3            2011-10-14
4            2011-10-07
5            2011-10-14
7            2011-10-17
8            2011-10-14

Những người nào có ngày muộn nhất trước một thời gian nhất định?

select g.Client_id, max(Registration_date) as last_reg
from groups as g join Registration as r
on g.Registration_id = r.Id
group by g.Client_id
having max(Registration_date) < '2011-10-08';
g.Client_id  last_reg  
-----------  ----------
4            2011-10-07

IIUC điều đó có nghĩa là khách hàng số 4 sẽ bị xóa và bất kỳ thứ gì anh ta đã đăng ký sẽ bị xóa. Đăng ký sẽ là

select * from Registration
where Id in (
      select Registration_id from groups as g
      where Client_id in ( 
            select g.Client_id
            from groups as g join Registration as r
            on g.Registration_id = r.Id
            group by g.Client_id
            having max(Registration_date) < '2011-10-08'
      )
);
Id          Registration_date
----------  -----------------
5           2011-10-07       

Và, chắc chắn, ứng dụng khách số 4 nằm trong Đăng ký số 5 và là ứng dụng khách duy nhất bị xóa bởi thử nghiệm này.

Từ đó, bạn có thể tìm ra delete các câu lệnh. Tôi nghĩ quy tắc là "xóa khách hàng và bất kỳ thứ gì anh ta đã đăng ký". Nếu vậy, có lẽ tôi sẽ ghi ID đăng ký vào một bảng tạm thời và ghi các lần xóa cho cả RegistrationAssociatedClient bằng cách tham gia vào nó.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Lỗi cú pháp MySQL khi sử dụng lệnh LIMIT với Câu lệnh chuẩn bị trong Java

  2. Lưu hình ảnh trong MySQL từ Java

  3. Tách giá trị từ một trường thành hai trường

  4. cập nhật nhiều lần bằng ajax với php

  5. Sắp xếp cột chuỗi chứa số trong SQL?