Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Probleme beim Umwickeln komplexer SQL-Löschabfragen

Beginnen Sie damit, die Registrierungen der anderen Clients einer Registrierung zu identifizieren. Hier ist eine Ansicht:

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;

Das gibt uns:

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         

Sie brauchen natürlich keine Aussicht; es ist nur aus Bequemlichkeit. Sie könnten einfach einen virtuellen Tisch verwenden. Aber überprüfen Sie es sorgfältig, um sich selbst davon zu überzeugen, dass es für jeden Kunden die richtige Auswahl an „Freundesregistrierungen“ produziert. Beachten Sie, dass die Ansicht nicht Referenz Registration . Das ist wichtig, weil es die gleichen Ergebnisse liefert, auch nachdem wir es zum Löschen aus Registration verwendet haben , sodass wir es für die zweite Löschanweisung verwenden können.

Jetzt haben wir eine Liste von Kunden und deren "Kumpelregistrierungen". Was ist das Datum der letzten Registrierung jedes Freundes?

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

Welche haben ein spätestes Datum vor einer bestimmten Uhrzeit?

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, das würde bedeuten, dass Kunde Nr. 4 gelöscht werden sollte, und alles, wofür er sich registriert hat, sollte gelöscht werden. Registrierungen wären

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       

Und tatsächlich befindet sich Client Nr. 4 in Registrierung Nr. 5 und ist der einzige Client, der bei diesem Test gelöscht wird.

Von dort aus können Sie das delete erarbeiten Aussagen. Ich denke, die Regel lautet "Lösche den Kunden und alles, wofür er sich registriert hat". Wenn ja, würde ich wahrscheinlich die Registrierungs-IDs in eine temporäre Tabelle schreiben und die Löschungen für beide Registration schreiben und AssociatedClient indem Sie sich ihr anschließen.