2013-02-08 8 views
7

मान लें मैं निम्न तालिकाओं है:MySQL क्वेरी तालिका के आधार पर mysql में कॉलम अपडेट करने के लिए?

TableA

a_name | age | country 
Jordan | 5 | Germany 
Jordan | 6 | Spain 
Molly | 6 | Spain 
Paris | 7 | France 
John | 7 | Saudi Arabia 
John | 5 | Saudi Arabia 
John | 6 | Spain 

tableB

id (auto increment primary key) 
    | age | country  | group_num (initially null) 
1 | 5 | Germany  | 
2 | 6 | Spain  | 
3 | 7 | France  | 
4 | 7 | Spain  | 
5 | 8 | France  | 
6 | 9 | France  | 
7 | 2 | Mexico  | 
8 | 7 | Saudi Arabia | 
9 | 5 | Saudi Arabia | 

मैं चयन/अद्यतन जहां मैं निम्नलिखित प्राप्त करने में सक्षम हूँ किसी तरह ऐसा करने में सक्षम होना चाहता हूँ "group_num" कॉलम के लिए मान:

टेबलबी

क्यों आईडी के 1,2,3,8,9 सभी एक ही ग्रुप क्योंकि जॉर्डन, मौली, और पेरिस सब का क्या है

1) Places person "a_name" went. 
2) Whether other people visited that same country. (regardless of age). 

कारण:

id (auto increment primary key) 
    | age | country  | group_num 
1 | 5 | Germany  | 1 
2 | 6 | Spain  | 1 
3 | 7 | France  | 1 
4 | 7 | Spain  | 
5 | 7 | France  | 2 
6 | 9 | France  | 
7 | 2 | Mexico  | 
8 | 7 | Saudi Arabia | 1 
9 | 5 | Saudi Arabia | 1 

group_num के मानदंडों के आधार पर असाइन किया गया है उपरोक्त दो मानदंडों के कारण किसी भी तरह से जुड़ा हुआ हो। (वे सभी स्पेन के लिए गए थे) और अन्य देशों, यानी जर्मनी का दौरा जॉर्डन ने किया था, जिसने स्पेन का दौरा किया था, इसलिए इसमें एक ही समूह_नम है। सऊदी अरब का दौरा जॉन ने किया था, जिसने स्पेन का दौरा किया था, इसलिए इसमें एक ही समूह_नम है।

है वहाँ कुछ एसक्यूएल क्वेरी के (या ऊपर दिखाए गए वांछित परिणाम प्राप्त करने के लिए अन्य "पूरक" टेबल के निर्माण को शामिल नहीं हो सकता है? (यानी यह ठीक है अगर group_num पहले auto_incrementing मूल्यों के साथ भरा होना चाहिए "आईडी" की तरह, फिर आवश्यक होने पर बाद में अपडेट किया गया। (वर्तमान में "(खाली)"

कर्सर/पुनरावृत्ति बहुत धीमी है के रूप में दिखाए गए अन्य मान फ़ील्ड के लिए गैर-शून्य मान होना ठीक है ... निम्नलिखित मान हैं जो मैं उन मानों को भरने के लिए करता हूं, कर्सर का उपयोग करके बहुत धीमी प्रक्रिया, अगर मैं इससे छुटकारा पा सकता हूं तो यह बहुत अच्छा होगा:

  1. टेबल ए के लिए, हम देखते हैं कि जॉर्डन 5 साल की उम्र में जर्मनी का दौरा किया था। (5_, जर्मनी] के लिए tableB में Group_Num 1 तक अपडेट किया गया है)।
  2. जॉर्डन 6. उम्र में स्पेन का दौरा (के लिए समूह अंक [6, स्पेन] 1 के लिए अद्यतन अपने ही समूह को दिखाने के लिए के रूप में ही पुरुष जॉर्डन स्पेन का दौरा किया)
  3. मौली 6 साल की उम्र (के लिए group_num [6 पर स्पेन का दौरा किया , स्पेन] 1 से अपडेट किया गया है, भले ही यह एक अलग व्यक्ति है, वही उम्र/देश जोड़ी मारा गया था)
  4. पेरिस 7 साल की उम्र में फ्रांस का दौरा किया (tableB में group_num 2 से अपडेट किया गया क्योंकि वह एक अलग व्यक्ति है, पूरी तरह से अलग है देश, भले ही उम्र के।
  5. जॉन 7 साल की उम्र में सऊदी अरब का दौरा (के लिए group_num [7, सऊदी अरब] उम्र + देश जोड़ी के लिए 3 के लिए अद्यतन tableB में)
  6. जॉन उम्र 5 पर सऊदी अरब का दौरा (table_num [5, सऊदी अरब] के लिए tableB में उम्र 3 के लिए अपडेट किया गया है + देश की जोड़ी अभी भी जॉन के बाद से अपडेट की गई है)
  7. जॉन 6 साल की उम्र में स्पेन का दौरा करता है ([6, स्पेन] के लिए group_num पहले से ही 1 है .. जॉर्डन पहले वहां गया , वहाँ कुछ समूह हो सकता है ... सभी स्थानों जॉन का दौरा किया तो group_num [6, स्पेन], [5, सऊदी अरब], और [7, सऊदी अरब] सभी 1
+4

[आपने क्या प्रयास किया है?] (Http://www.whathaveyoutried.com/) देखें [सलाह पूछें] (http://stackoverflow.com/questions/ask-advice), कृपया। –

+0

प्रोग्रामिक रूप से SQLA कर्सर का उपयोग तालिका ए की प्रत्येक पंक्ति के माध्यम से पुनरावृत्त करने के लिए, और आवश्यकतानुसार tableB को अद्यतन करना। यदि SQL क्वेरी (ies) के साथ संभव हो तो ऐसा करने का बेहतर तरीका ढूंढना। – Rolando

+1

दुर्भाग्यपूर्ण है कि उदाहरण के लोगों में जॉर्डन (एक देश) और पेरिस (दूसरे देश में एक प्रसिद्ध शहर) जैसे नाम हैं – Magnus

उत्तर

1

आप एक सतत दृष्टिकोण है जो प्रत्येक नए आइटम पर आधारित होगा Table1 जोड़नी होगी अगर आप ऐसे प्रत्येक आइटम के लिए निम्नलिखित बयानों पर अमल यह तेजी से और कुशल हो जाएगा:

यहाँ के राज्य के लिए SQLFiddle है तालिका 1 में अंतिम रिकॉर्ड डालने से ठीक पहले डीबी।

बीटीडब्लू: आपका उदाहरण पूरी तरह से आपके विवरण के अनुरूप नहीं है, मुझे लगता है कि आपने गलती से समूह 1 के रूप में फ्रांस 7 पर हस्ताक्षर किए हैं, क्योंकि पेरिस के समूह 1 में किसी के साथ कोई संबंध नहीं है

उन निष्कर्षों पर ध्यान दें जिन्हें मैं निष्पादित कर रहा हूं:

  1. पहले एक मेरे पिछले स्थानों मैं दौरा किया है के समूह संख्या के लिए खोज (यह मेरा संबंध तोड़ना समूह, उदा है समूह संख्या 3)।
  2. दूसरा खोजें है अगर वहाँ स्पेन के लिए समूह संख्या और उम्र 6.

खोज जानने आप दो संबंध तोड़ना सेट है कि में शामिल हो गए हो जाता है उसके बाद से एक संबंध तोड़ना समूह में डाले रिकॉर्ड से संबंधित हो सकता है, नव डाला रिकॉर्ड का एक परिणाम के रूप में, आपको लगता है कि अद्यतन सभी समूह संख्या पहले से पहले एक के बाद दूसरे समूह संख्या के रूप में, इस तरह के रास्ते में सौंपा हो सकता है:

UPDATE Table2 set group_num = 1 where group_num = 3

तो मैं किसी भी कर्सर उपयोग नहीं किया है, लेकिन यह अद्यतन तालिका 1 के लिए प्रति डालने है।

0

को अपडेट किया जाता @ दमास्कुसी आप देख सकते हैं कि बाघ कर्सर के बजाय काम कर सकते हैं या नहीं। ट्रिगर्स कर्सर से तेज़ होते हैं यदि आप केवल फ्लाई पर group_num को अपडेट कर सकते हैं और जब डेटा ए में डेटा डाला जाता है।