2009-10-03 6 views
28
UPDATE messages set test_read =1 
     WHERE userid='xyz' 
     ORDER BY date_added DESC 
     LIMIT 5, 5 ; 

मैं सीमा का उपयोग करें 5 पंक्तियों का एक सेट अद्यतन करने के लिए इस क्वेरी का उपयोग करने की कोशिश कर रहा हूं, लेकिन mysql एक error..The नीचे एक दिखा रहा हैmysql में सीमा का उपयोग कर एकाधिक पंक्तियों को अपडेट करें?

UPDATE messages set test_read =1 
     WHERE userid='xyz' 
     ORDER BY date_added DESC 
     LIMIT 5 ; 

काम कर रहा है यही कारण है कि पहले एक काम नहीं कर रहा?

उत्तर

53

तुम सच में यह इस तरह से करना चाहिए, तो आप कुछ इस तरह का उपयोग कर सकते हैं:

UPDATE messages SET test_read=1 
WHERE id IN (
    SELECT id FROM (
     SELECT id FROM messages 
     ORDER BY date_added DESC 
     LIMIT 5, 5 
    ) tmp 
); 
+1

क्या आपको वास्तव में डबल नेस्टेड चयन की आवश्यकता है? एमएस एसक्यूएल में यह कुछ ऐसा होगा जैसे "आईडी में (दिनांक आईडीडैड डीईएससी द्वारा संदेश ऑर्डर से शीर्ष 5 आईडी चुनें)" –

+19

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

+2

जब आप पूछते हैं कि 'अगर आपको वास्तव में ऐसा करना चाहिए', तो क्या आप इसका मतलब बता रहे हैं कि अपने खेतों में से किसी एक के आदेश द्वारा दिए गए रैंक के आधार पर रिकॉर्ड अपडेट करने का बेहतर विकल्प है? – deed02392

5

http://bugs.mysql.com/bug.php?id=42415

प्रलेखन कहा गया है कि सीमा खंड के साथ किसी भी अद्यतन बयान के बाद से असुरक्षित माना जाता है प्रभावित पंक्तियों का क्रम परिभाषित नहीं है: http://dev.mysql.com/doc/refman/5.1/en/replication-features-limit.html

हालांकि, यदि "पीके द्वारा ऑर्डर" का उपयोग किया जाता है, तो पंक्तियों का क्रम परिभाषित किया जाता है और इस तरह का कथन बिना किसी चेतावनी के बयान प्रारूप में लॉग किया जा सकता है।

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