2011-02-04 9 views
5

मेरे पास दो MySQL टेबल हैं। एक वोट तालिका (id, userId, postId, voteTypeId), और एक पोस्ट तालिका (id, postTypeId, userId, parentId) तालिका। मैं एक ट्रिगर लिख रहा हूं जो वोटों पर डालने के बाद आग लगती है।MySQL में एक अलग तालिका को अद्यतन करने के लिए मैं ट्रिगर का उपयोग कैसे कर सकता हूं?

मैं पदों तालिका में एक पोस्ट अद्यतन करने के लिए ट्रिगर करना चाहते हैं। लेकिन यह पोस्ट postId के तहत मेरी वोट तालिका में संदर्भित नहीं है; यह उस पोस्ट का अभिभावक है।

BEGIN 
CASE NEW.voteTypeId 
    WHEN 2 THEN UPDATE posts SET posts.acceptedAnswerId = NEW.postId WHERE posts.id = @the parent postId of NEW.postId 
    ELSE 
     BEGIN 
     END; 
    END CASE; 
END 

मैं की @the माता पिता के बजाय इस उपयोग करने की कोशिश ...:

(SELECT posts.parentId FROM posts WHERE posts.id = NEW.postId) 

लेकिन तुम मैं जब तक आप वाक्य विन्यास में चयन के कुछ प्रकार का उपयोग नहीं लगता है कि आप ट्रिगर में चयन करता है क्या कर सकते हैं करते हैं । माता-पिता पद का मेरा एकमात्र संदर्भ जिसे मैं अपडेट करना चाहता हूं वह है अपने बच्चे के पोस्ट वोट में संदर्भित है। इसलिए मुझे नहीं पता कि चयन के माध्यम से सही आईडी को पकड़ने के बिना अद्यतन कैसे करें।

क्या यह संभव है?

+0

आप कर सकते हैं वास्तव में एक ट्रिगर के भीतर एक का चयन करते हैं। आपका अन्य वाक्यविन्यास हालांकि थोड़ा सा दिखता है। – Mchl

+0

@Mchl, मैंने कुछ संयोजनों की कोशिश की, लेकिन यह काम नहीं किया। क्या आप मुझे बता सकते हैं कि मैं क्या गलत कर रहा हूं? – Mohamad

उत्तर

2

मुझे लगता है कि जैसे यह करना चाहते हैं:

BEGIN 
    IF (NEW.voteTypeId = 2) THEN 
    UPDATE 
     posts AS p 
    CROSS JOIN 
     posts AS p2 
    ON 
     p.id = p2.parentId 
    SET 
    p.acceptedAnswerId = NEW.postId 
    WHERE 
    p2.id = NEW.postId; 
    END IF; 
END 
+0

इसके लिए धन्यवाद। क्या मैं सिर्फ आपसे पूछ सकता हूं कि आप क्रॉस जॉइन का उपयोग क्यों करते हैं? उपनाम के साथ सिर्फ एक सामान्य शामिल क्यों नहीं? – Mohamad

+1

MySQL में 'अंदरूनी JOIN' और' क्रॉस JOIN' और 'JOIN' सब बराबर हैं। असल में, एएनएसआई एसक्यूएल विनिर्देश के अनुसार, मुझे यहां 'इनर जॉइन' का उपयोग करना चाहिए था (क्योंकि मैंने 'USING()' के बजाय 'ON' स्थिति में शामिल किया था। कार्यात्मक रूप से यह कोई फर्क नहीं पड़ता है, लेकिन संभावित रूप से पोर्टेबिलिटी को हटा देता है। – Mchl

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

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