2012-07-13 17 views
9

मैं मुड़ अजगर में इन दो प्रश्नों गठबंधन करने के लिए कोशिश कर रहा हूँ:MySQL: वापसी अद्यतन पंक्तियों

SELECT * FROM table WHERE group_id = 1013 and time > 100; 

और:

UPDATE table SET time = 0 WHERE group_id = 1013 and time > 100 

किसी एक क्वेरी में। क्या ऐसा करना संभव है?

मैंने एक उप क्वेरी में SELECT डालने का प्रयास किया, लेकिन मुझे नहीं लगता कि पूरी क्वेरी मुझे जो चाहिए वह लौटाती है।

क्या ऐसा करने का कोई तरीका है? (यहां तक ​​कि बेहतर, उप क्वेरी के बिना) या क्या मुझे बस दो प्रश्नों के साथ रहना है?

धन्यवाद,

क्वान

+2

ये धारणात्मक हैं दो अलग-अलग क्रियाएं किसी भी तरह से उन्हें संयोजित करके आप क्या हासिल करने की कोशिश कर रहे हैं? – Wiseguy

+0

मैं जितनी जल्दी हो सके अपनी क्वेरी बनाने की कोशिश कर रहा हूं, क्योंकि यह भारी भार संभालेगा। –

+1

ठीक है, आप इन प्रश्नों को गठबंधन नहीं कर सकते हैं। गति को अनुकूलित करने के लिए, अपने टेबल को सही ढंग से इंडेक्स करना सुनिश्चित करें। ['EXPLAIN'] (http://dev.mysql.com/doc/refman/5.5/en/using-explain.html) आपको उन चीज़ों के बारे में सूचित करने में मदद करेगा जिन्हें अनुकूलित करने की आवश्यकता है। – Wiseguy

उत्तर

3

आप इन प्रश्नों को सीधे जोड़ नहीं सकते हैं। लेकिन आप एक संग्रहीत प्रक्रिया लिख ​​सकते हैं जो दोनों प्रश्नों को निष्पादित करता है। उदाहरण:

delimiter | 
create procedure upd_select(IN group INT, IN time INT) 
begin 
    UPDATE table SET time = 0 WHERE group_id = @group and time > @time; 
    SELECT * FROM table WHERE group_id = @group and time > @time; 
end; 
| 
delimiter ; 
+3

अद्यतन करने के बाद स्क्वायर लियोहार्ट लौटने वाली पंक्तियों में समय = 0 है, इसलिए स्थिति समय के साथ चयन> @time अपेक्षित काम नहीं करेगा। – md2perpe

5

जाहिर mysql कुछ है कि काम का हो सकता है, खासकर अगर आप केवल एक पंक्ति अद्यतन कर रहे है। http://lists.mysql.com/mysql/219882

UPDATE mytable SET 
mycolumn = @mycolumn := mycolumn + 1 
WHERE mykey = 'dante'; 

SELECT @mycolumn; 

मैं इस हालांकि की कोशिश कभी नहीं की है, लेकिन मुझे पता है कि कैसे आप पर मिलता है है:

इस उदाहरण से है।

+0

धन्यवाद, लेकिन मैं कई पंक्तियों को वापस करना चाहता हूं –

2

तो तुम क्या करने की कोशिश कर रहे हैं रीसेट time शून्य जब भी आप एक पंक्ति तक पहुँचने के लिए - तरह की एक ट्रिगर की तरह है, लेकिन MySQL SELECT के बाद चलाता नहीं कर सकते।

शायद ऐप से एक सर्वर अनुरोध के साथ ऐसा करने का सबसे अच्छा तरीका एक संग्रहित प्रक्रिया लिखना है जो अद्यतन करता है और फिर पंक्ति देता है। यदि दोनों एक साथ होने के लिए बहुत महत्वपूर्ण हैं, तो लेनदेन में दो बयान लपेटें।

1

अद्यतन पंक्तियों की वापसी की एक तेजी से संस्करण है, और अधिक सही जब अत्यधिक लोड प्रणाली के साथ काम कर एक ही डाटाबेस सर्वर पर एक ही समय में क्वेरी के निष्पादन के लिए पूछता है

update table_name WITH (UPDLOCK, READPAST) 
SET state = 1 
OUTPUT inserted. 
+1

मेरा मानना ​​है कि यह केवल एमएस एसक्यूएल पर काम करता है। पोस्ट MySQL के संबंध में था। – PromInc

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