sql >> Database >  >> RDS >> Mysql

Problemen met het omwikkelen van hoofd rond complexe SQL-verwijderquery

Begin met het identificeren van de registraties van de andere klanten van een registratie. Hier is een weergave:

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;

Dat geeft ons:

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         

Je hebt natuurlijk geen uitzicht nodig; het is gewoon voor het gemak. Je zou gewoon een virtuele tafel kunnen gebruiken. Maar inspecteer het zorgvuldig om uzelf ervan te overtuigen dat het voor elke klant de juiste reeks "vriendregistraties" oplevert. Merk op dat de weergave niet . doet referentie Registration . Dat is belangrijk omdat het dezelfde resultaten oplevert, zelfs nadat we het gebruiken om te verwijderen uit Registration , zodat we het kunnen gebruiken voor de tweede delete-instructie.

Nu hebben we een lijst met klanten en hun "vriendenregistraties". Wat is de datum van de laatste registratie van elke vriend?

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

Welke hebben een uiterste datum voor een bepaalde tijd?

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 dat zou betekenen dat client #4 moet worden verwijderd en alles waarvoor hij zich heeft geregistreerd, moet worden verwijderd. Registraties zijn

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       

En inderdaad, klant #4 staat in Registratie #5 en is de enige klant die door deze test kan worden verwijderd.

Van daaruit kun je de delete . uitwerken verklaringen. Ik denk dat de regel is "verwijder de klant en alles waarvoor hij zich heeft geregistreerd". Als dat zo is, zou ik waarschijnlijk de registratie-ID's naar een tijdelijke tabel schrijven en de verwijderingen voor beide Registration en AssociatedClient door eraan mee te doen.



  1. Kan geen verbinding maken met de postgres-server in een docker vanuit een gedockte app

  2. Hoe JSON-gegevens van php te krijgen en in tekstweergave in Android weer te geven?

  3. Mysql High UPDATE SELECT veroorzaakt vertraging

  4. EXISTS vs JOIN en gebruik van de EXISTS-clausule