Mysql
 sql >> Base de données >  >> RDS >> Mysql

Problème de tête autour de la requête de suppression SQL complexe

Commencez par identifier les inscriptions des autres clients d'une inscription. Voici une vue :

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;

Cela nous donne :

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         

Vous n'avez pas besoin d'une vue, bien sûr; c'est juste pour le confort. Vous pouvez simplement utiliser une table virtuelle. Mais inspectez-le attentivement pour vous convaincre qu'il produit la bonne gamme "d'enregistrements de copains" pour chaque client. Notez que la vue ne le fait pas référence Registration . C'est important car cela produit les mêmes résultats même après l'avoir utilisé pour supprimer de Registration , afin que nous puissions l'utiliser pour la deuxième instruction de suppression.

Nous avons maintenant une liste de clients et leurs "enregistrements de copains". Quelle est la date de la dernière inscription de chaque ami ?

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

Lesquels ont une date limite avant une heure certaine ?

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, cela signifierait que le client n ° 4 devrait être supprimé et que tout ce pour quoi il s'est inscrit devrait être supprimé. Les inscriptions seraient

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       

Et, bien sûr, le client #4 est dans l'enregistrement #5, et est le seul client sujet à suppression par ce test.

De là, vous pouvez travailler sur le delete déclarations. Je pense que la règle est "supprimer le client et tout ce pour quoi il s'est inscrit". Si c'est le cas, j'écrirais probablement les identifiants d'enregistrement dans une table temporaire et j'écrirais les suppressions pour les deux Registration et AssociatedClient en y adhérant.