Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

जटिल एसक्यूएल डिलीट क्वेरी के आसपास सिर लपेटने में परेशानी

पंजीकरण के अन्य ग्राहकों के पंजीकरण की पहचान करके शुरू करें। यहाँ एक दृश्य है:

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. यह पता लगाने के 3 तरीके कि क्या कोई स्ट्रिंग MySQL में रेगुलर एक्सप्रेशन से मेल खाती है

  2. MySQL समय को कैसे बदलें

  3. SQL सर्वर में (MySQL) LIMIT कैसे लिखें?

  4. MySQL त्रुटि क्यों दे रहा है किसी फ़ंक्शन से परिणाम सेट वापस करने की अनुमति नहीं है?

  5. Mysql में एक डेटाबेस टेबल से दूसरी डेटाबेस टेबल में डेटा कैसे डालें?