5

मान लीजिए आप आप दो पदार्थोंक्या टेबल को सामान्य करने के लिए शॉर्टकट है जहां कॉलम = पंक्तियां?

Product A B C 
--------------------- 
A   y n y 
B   n y y 
C   y y y 

मिश्रण कर सकते हैं, तो पहला कदम यह कैसा

P1 P2 ? 
----------- 
A A y 
A B n 
A C y 
B A y 
B B y 
B C n 
C A y 
C B n 
C C y 

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

P1 P2 ? 
----------- 
A A y 
A B n 
A C y 
B B y 
B C n 
C C y 

पाने के लिए कई पंक्तियों ही निकाल सकते हैं अंतिम चरण एक छोटी सी मेज के साथ बहुत आसान था, होगा हमेशा एक बड़ी मेज पर ले लो। डुप्लिकेट मीनिंग के साथ पंक्तियों को हटाने के बारे में कोई कैसे जाएगा, लेकिन समान सामग्री नहीं?

धन्यवाद, मुझे आशा है कि मेरे सवाल के रूप में मैं अभी भी डेटाबेस

+1

'एक एक y',' बी बी y' आदि बहुत स्पष्ट लग रहे हैं। शुरुआत से ही, आप टेबल को सही तरीके से क्यों नहीं उत्पन्न करते? विकर्ण को छोड़कर बस त्रिकोणों में से एक ले लो। – mvds

उत्तर

4

यदि यह है कि आप के साथ सभी संबंधों अप दोगुनी है, उदा शुरू कर रहे हैं ग्रहण करने के लिए सुरक्षित है सीख रहा हूँ समझ में आता है

यदि A B तालिका में है, तो B A तालिका में होने की गारंटी है।

तो आपको बस उन सभी पंक्तियों को हटा देना है जहां पी 2 < पी 1;

DELETE FROM `table_name` WHERE `P2` < `P1`; 

अगर ऐसा नहीं है, आप तालिका के माध्यम से जा रहा है और सभी डुप्लिकेट पंक्तियों को डालने यदि पहले से नहीं भी मौजूद हैं, तो यह चलाकर मामले बना सकते हैं।

+0

मुझे खुशी है कि आपने मेरा उत्तर उपयोगी पाया - लेकिन मैं स्वीकार करने से पहले प्रतिक्रियाओं के लिए लंबे समय तक प्रतीक्षा करने की अनुशंसा करता हूं। यह काफी संभव है कि इससे बेहतर समाधान हो, या मेरे में एक गंभीर दोष है। –

+0

अच्छा बिंदु। मैं बाहर राह देखूँगा। – thomas

+0

अच्छा जवाब - जब तक यह धारणा है कि सभी रिश्ते दोगुनी हो गए हैं, सच है। यदि आप यह सुनिश्चित नहीं कर सकते कि धारणा पकड़ जाएगी, हालांकि, आपको हटाने से पहले डुप्लिकेट की जांच करनी चाहिए। – dave

1

चरण 1 (के रूप में आप पहले से ही किया है): चरण 2 तालिका 2

को
P1 P2 ? 
----------- 
A A y 
A B n 
A C y 
B A y 
B B y 
B C n 
C A y 
C B n 
C C y 

रूपांतरण करें: पुन: व्यवस्थित स्तंभ, का चयन विशिष्ट

SELECT DISTINCT 
    IF P1<P2 THEN P1 ELSE P2 END as P1, -- this puts the smallest value in P1 
    IF P1>P2 THEN P1 ELSE P2 END as P2 -- this puts the largest value in P2 
FROM Table2 
WHERE NOT P1=P2 --(Assuming records like A, A, y are not interesting) 

मैं, एक mySQL पुरुष नहीं कर रहा हूँ ताकि आप अगर/तो वाक्यविन्यास की जांच करने की आवश्यकता हो सकती है, लेकिन यह वैसे भी वैचारिक रूप से ठीक लगता है।

+0

बीटीडब्ल्यू - शायद यह सिर्फ होमवर्क है - लेकिन असली दुनिया की चिंता के लिए - आप मिश्रणों को 2 से अधिक भागों के साथ विचार कर सकते हैं। उदाहरण के लिए, बी के साथ ए मिश्रण करना ठीक हो सकता है; और सी के साथ बी मिश्रण करने के लिए ठीक है; लेकिन सभी तीन ए, बी और सी मिश्रण एक साथ हो सकता है जो आप टालना चाहते हैं। – dave

+0

मैं और धन्यवाद। (इंटर्नशिप) – thomas

2

मुझे नहीं लगता कि यह आपकी स्थिति में आवश्यक है, लेकिन एक बौद्धिक अभ्यास के रूप में, आप जेमी वोंग के समाधान पर निर्माण कर सकते हैं और गैर-डुप्लिकेट कॉलम को EXISTS क्लॉज से हटाए जाने से रोक सकते हैं। इस तरह कुछ:

DELETE FROM `table_name` AS t1 
    WHERE `P2` < `P1` 
    AND EXISTS (SELECT NULL FROM `table_name` AS t2 
     WHERE t1.`P1` = t2.`P2` AND t1.`P2` = t2.`P1`); 

यह बहुत कुछ सुनिश्चित करता है कि कुछ भी हटाने से पहले एक डुप्लिकेट है।

(मेरे MySQL वाक्य रचना एक छोटे से बंद हो सकता है, यह एक समय हो गया है।)

+0

अच्छा बिंदु। यदि आप डिलीट दृष्टिकोण का उपयोग करते हैं, तो आपको हटाने से पहले डुप्लिकेट की जांच करनी चाहिए। आप पूरी तरह से हटाने और डुप्लिकेट जांच से बच सकते हैं, हालांकि (ऊपर मेरा जवाब देखें)। – dave

+0

@ डेव शायद "ऊपर" नहीं कहना चाहिए। जब तक कि आप निश्चित नहीं हैं, यह अधिक अपवॉट प्राप्त करेगा: पी –

+0

मैं इसे ध्यान में रखूंगा। धन्यवाद – thomas

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

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