2009-08-01 11 views
23

को अपडेट करें 2 टेबल/इकाइयां, बहुत सीधी परिदृश्य।MySQL: एक तालिका से रिकॉर्ड गिनें और फिर

टेबल कवियों - कॉलम: आईडी, कवि, राष्ट्र

टेबल देशों - कॉलम: आईडी, राष्ट्र, गिनती

असल में, देशों को कवियों एक की मैपिंग है स्वाभाविक रूप से कई लोगों के लिए। उदाहरण के लिए, 60 देशों से 1000 कवि हैं। कवियों में प्रत्येक कवि देश के क्षेत्र द्वारा एक राष्ट्र को सौंपा गया है जिसमें देशों में राष्ट्रों में से एक की आईडी शामिल है।

देशों की गिनती क्षेत्र कवियों इस राष्ट्र से में कवियों की संख्या में शामिल हैं।

मेरा प्रश्न है कि कवियों में देश द्वारा कवियों की संख्या की गणना करने के लिए केवल एक SQL क्वेरी का उपयोग कैसे करें और फिर उस देश की इसी गणना को अपडेट करें?

मैंने कोशिश की:

UPDATE poets, nations SET nations.count = COUNT(poets.id) GROUP BY poets.nation HAVING poets.nation = nations.id 

लेकिन यह # 1064 त्रुटि देता है। कहीं भी जहां क्लॉज गठबंधन करने की कोशिश की लेकिन यह अभी भी काम करने से इंकार कर देता है।

कोई विचार?

उत्तर

32

एक सबक्वेरी का उपयोग करें:

UPDATE nations 
    SET count = (
     SELECT COUNT(id) 
     FROM poets 
     WHERE poets.nation = nations.id 
     GROUP BY id 
     ); 
+0

धन्यवाद, यह चाल काम करता है! –

+6

कृपया ध्यान दें कि बहुत बड़ी टेबल (500000+ रिकॉर्ड) के लिए यह बहुत धीमा हो सकता है। – dusoft

+0

इसके अलावा, यदि राष्ट्र.count शून्य नहीं है, तो इसके परिणामस्वरूप चेतावनियां हो सकती हैं। इसके खिलाफ सुरक्षा के लिए एक IFNULL का उपयोग करें। अद्यतन राष्ट्र एसईटी गिनती = IFNULL (कवियों से चुनें COUNT (आईडी) जहां poets.nation = राष्ट्र.आईडी आईडी द्वारा ग्रुप), 0); –

18

तुम बस ग्रुप द्वारा, सीएफ .:

UPDATE nations SET count = (
    SELECT COUNT(id) FROM poets 
    WHERE poets.nation = nations.id); 

या बल्कि, ग्रुप द्वारा के साथ की जरूरत नहीं है, सबक्वेरी देशों है कि नहीं के लिए शून्य वापस आ जाएगी कवियों। समूह के बिना, इस मामले में subquery 0 वापस आ जाएगा।

+0

समूह/बिना समूह के शून्य/0 अंतर - इससे मदद मिली। धन्यवाद –

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