Mysql
 sql >> база данни >  >> RDS >> Mysql

Проблем при обвиване на главата около сложна заявка за изтриване на SQL

Започнете с идентифициране на регистрациите на другите клиенти на една регистрация. Ето един изглед:

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;

Това ни дава:

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         

Нямате нужда от изглед, разбира се; това е само за удобство. Можете просто да използвате виртуална маса. Но проверете го внимателно, за да се убедите, че произвежда правилния набор от „регистрации на приятели“ за всеки клиент. Имайте предвид, че изгледът не справка Registration . Това е важно, защото дава същите резултати дори след като го използваме за изтриване от Registration , така че можем да го използваме за втория израз за изтриване.

Сега имаме списък с клиенти и техните "приятелски регистрации". Коя е датата на последната регистрация на всеки приятел?

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

Кои имат последна дата преди определено време?

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, което би означавало, че клиент #4 трябва да бъде изтрит и всичко, за което се е регистрирал, трябва да бъде изтрито. Регистрациите ще бъдат

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       

И, разбира се, клиент #4 е в регистрация #5 и е единственият клиент, който подлежи на изтриване от този тест.

От там можете да изработите delete изявления. Мисля, че правилото е "изтрийте клиента и всичко, за което се е регистрирал". Ако е така, вероятно ще запиша идентификаторите за регистрация във временна таблица и ще напиша изтриванията и за двете Registration и AssociatedClient като се присъедини към него.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Грешка с дублирана колона на MySQL само когато заявката е обвита като подзаявка

  2. Възможно ли е да се използва клауза WHERE за избор на всички записи в SQL изявление?

  3. CakePHP 3 defaultConnectionName в модела на плъгин не работи

  4. Laravel 5.5 шарнирно свързване, за да получите опорни стойности с основния MySQL резултат

  5. Има ли ограничения за дължината на низа в mysql?