2009-12-14 7 views
7

मेरे पास दो फ़ील्ड sesskey (varchar32, अनुक्रमणिका) और उत्पादों (int11) के साथ एक तालिका है, अब मुझे उन सभी पंक्तियों को हटाना है जिनमें सेस्की गिनती (*) = 1. मैं कुछ तरीकों की कोशिश कर रहा हूं लेकिन सभी विफल हो जाते हैं।MYSQL गिनती वाले सभी परिणामों को हटाएं (*) = 1

उदाहरण:

delete from taged where sesskey in (select sesskey from taged group by sesskey having count(*) = 1) 

sesskey क्षेत्र नहीं एक प्राथमिक कुंजी है क्योंकि इसके दोहराया जा सकता है।

उत्तर

9
DELETE si 
FROM t_session si 
JOIN (
     SELECT sesskey 
     FROM t_session so 
     GROUP BY 
       sesskey 
     HAVING COUNT(*) = 1 
     ) q 
ON  q.sesskey = si.sesskey 

आपको यहां शामिल होने की आवश्यकता है। एक सहसंबंधित सबक्वायरी का उपयोग करना काम नहीं करेगा।

और अधिक विस्तार के लिए अपने ब्लॉग में इस लेख देखें:

+0

किसी कारण से यह मेरे लिए हाल ही के mysql संस्करण में काम नहीं करता है। मुझे आपके ब्लॉग से उदाहरण का उपयोग करना पड़ा (बाएं जॉइन, आईडी न्यूल)। मैं गलत पंक्तियों को भी हटाने में कामयाब रहा: पी (मेरे मामले के लिए उपयोग नहीं किया गया था) – Spikolynn

1

सबक्वेरी काम करना चाहिए

Delete from taged 
    Where sesskey in 
    (Select sesskey 
     From taged 
     Group by sesskey 
     Having count(*) = 1) 

संपादित करें: धन्यवाद नीचे टिप्पणी @Quassnoi करने के लिए ... ऊपर होगा नहीं MySql में काम करते हैं, के रूप में MySQL तालिका संदर्भित प्रतिबंधित करता है एक सबक्वायरी में से अपडेट या हटाया जा रहा है, मुझे आपको एक ही चीज़ का उपयोग करके एक ही काम करना होगा ...

+0

कार्य नहीं करेगा (15 वर्ण) – Quassnoi

+0

# 1093 - आप लक्ष्य तालिका निर्दिष्ट नहीं कर सकते के लिए 'taged' खंड – Alex

+0

से अद्यतन करें कि त्रुटि भ्रमित है ... यहां कोई "अपडेट" नहीं चल रहा है ... इसका क्या अर्थ है? टेललेटनाम का उपयोग डेलेट खंड में है? या subquery में tablename का उपयोग (जो न तो अद्यतन कर रहा है और न ही कुछ हटा रहा है) –

1

या यदि आप एक का उपयोग कर रहे हैं पुराने (पूर्व 4.1) MySQL के संस्करण और सबक्वेरी आप एक तालिका में अपने डेटा को चयन करने की आवश्यकता करने के लिए पहुँच नहीं है, तो मूल के साथ कि तालिका में शामिल होने:

CREATE TABLE delete_me_table (sesskey varchar32, cur_total int); 

INSERT INTO delete_me_table SELECT sesskey, count(*) as cur_total FROM orig_table 
WHERE cur_total = 1 GROUP BY sesskey; 

DELETE FROM orig_table INNER JOIN delete_me_table USING (sesskey); 

अब आप delete_me_table नामित पर एक मेज छोड़ दिया है जिसमें आपके द्वारा हटाई गई सभी पंक्तियों का इतिहास शामिल है। आप इसे अपने आप को आश्चर्यचकित करने के लिए संग्रह, प्रवृत्ति, अन्य मजेदार और असामान्य चीज़ों के लिए इसका उपयोग कर सकते हैं।

संबंधित मुद्दे