sql >> Databáze >  >> RDS >> Mysql

Problémy s obtékáním složitých SQL dotazů na odstranění

Začněte identifikací registrací ostatních klientů registrace. Zde je pohled:

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;

To nám dává:

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         

Samozřejmě nepotřebujete výhled; je to jen pro pohodlí. Můžete použít pouze virtuální stůl. Pečlivě si jej však prohlédněte, abyste se přesvědčili, že pro každého klienta vytváří správný rozsah „registrací kamarádů“. Všimněte si, že zobrazení není odkaz Registration . To je důležité, protože poskytuje stejné výsledky, i když je použijeme k odstranění z Registration , takže jej můžeme použít pro druhý příkaz delete.

Nyní máme seznam klientů a jejich "kamarádských registrací". Jaké je datum poslední registrace každého kamaráda?

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

Které z nich mají nejnovější datum před určitým časem?

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, což by znamenalo, že klient č. 4 by měl být smazán a vše, pro co se zaregistroval, by mělo být smazáno. Registrace by byly

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       

A opravdu, klient #4 je v registraci #5 a je jediným klientem, který je tímto testem vymazán.

Odtud můžete provést delete prohlášení. Myslím, že pravidlo je "smazat klienta a vše, k čemu se zaregistroval". Pokud ano, pravděpodobně bych zapsal registrační ID do dočasné tabulky a zapsal smazání pro obě Registration a AssociatedClient tím, že se k němu připojíte.



  1. MySQL MOD() je nefunkční:Je to nejlepší alternativa?

  2. Je ve standardním SQL definováno „Where IN“ s více sloupci?

  3. SQL INSERT INTO více tabulek

  4. Záznamy SQL, jejichž platnost vyprší po 24 hodinách