2011-03-05 20 views
22

पर कई पंक्तियों पर एक कॉलम को अपडेट/बढ़ाएं, मैं कॉलम में पंक्तियां जोड़ने की कोशिश कर रहा हूं, नवीनतम कॉलम सेट के order को एक से ऊपर रखता हूं, और वहां से अन्य सभी पंक्तियां गिनती हैं।एक बार

इस मामले में, मैं ऑर्डर = 0 के साथ एक नई पंक्ति जोड़ता हूं, फिर सभी पंक्तियों को एक-एक करके अपडेट करने के लिए इस क्वेरी का उपयोग करें।

"UPDATE favorits SET order = order+1" 

हालांकि, क्या होता है कि सभी पंक्तियां एक ही मूल्य पर अपडेट की जाती हैं। मुझे पसंदीदा का ढेर मिलता है, उदाहरण के लिए क्रमशः 6 के साथ, जब यह 1 के साथ एक होना चाहिए, अगले 2 और इसी तरह के साथ होना चाहिए।

मैं इन पंक्तियों को इस तरह से कैसे अपडेट करूं जो उन्हें आदेश देने के तरीके का आदेश दे?

धन्यवाद,
~ जॉर्डन

+0

आपकी क्वेरी अच्छी लगती है और अलगाव में इच्छित के रूप में काम करना चाहिए। –

+0

सुंद सबसे विचित्र। क्या यह आपकी ** सटीक ** क्वेरी है या क्या आपके पास 'WHERE' क्लॉज है? आप इसे कैसे निष्पादित कर रहे हैं? यह निश्चित रूप से कई बार निष्पादित किया जाना चाहिए? क्या आपके पास टेबल पर कोई ट्रिगर है जो चीजों में हस्तक्षेप कर सकता है? इसके अलावा आपकी क्वेरी निश्चित रूप से 'अपडेट एसईटी ऑर्डर = @ ऑर्डर + 1' या कुछ पसंद नहीं है? –

+0

पीछे की ओर वृद्धि? बस समझने की कोशिश कर रहा है ... – Orbit

उत्तर

21

क्या आप इसे एक के बाद अपने आदेश क्षेत्र incrementing द्वारा तालिका में हर रिकॉर्ड को अपडेट करने के लिए डीबी कह रहे हैं। तो हर रिकॉर्ड हमेशा एक ही मूल्य होगा। मैं बेकार हूं कि आप नवीनतम रिकॉर्ड को 1 और सबसे पुराना रिकॉर्ड सेट करने की कोशिश कर रहे हैं (कोई रिकॉर्ड + 1)। अब इस संभालने जाता है कि कोई रिकॉर्ड नष्ट हो जाती हैं

set @count = (SELECT COUNT(ID) from favorits); 
UPDATE favourits SET order = @count-ID+1 

:

तो हो सकता है आप इस कोशिश कर सकते हैं। उस स्थिति में आपको इसके लिए समायोजन करना होगा और नवीनतम रिकॉर्ड 1 पर सेट करना होगा और फिर आईडी द्वारा क्रमबद्ध प्रत्येक पिछले रिकॉर्ड के लिए ऑर्डर वैल्यू बढ़ाएं।

तो इस दृष्टिकोण होगा:

set @i=0; 
set @Count=(SELECT COUNT(*) from favorits); 

UPDATE favorits SET `order` = @Count-(@i:[email protected]+1)+1; 
0

मैं intereted मिला, तो मैं निम्नलिखित समाधान के साथ आया था। निम्न तालिका पर विचार करें:

CREATE TABLE `placements` (
    `id` tinyint(3) unsigned NOT NULL AUTO_INCREMENT, 
    `user` varchar(12) NOT NULL, 
    `place` tinyint(3) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

INSERT INTO `placements` (`id`, `user`, `place`) VALUES 
(1, 'Adam', 1), 
(2, 'Bill', 2), 
(3, 'Carl', 3), 
(4, 'Doug', 4), 
(5, 'Eddy', 5), 
(6, 'Frank', 6), 
(7, 'George', 7), 
(8, 'Harry', 8), 
(9, 'Ian', 9), 
(10, 'John', 10); 

तो, मान लीजिए कि आपने जॉन # 1 जगह के लिए एडम के खिलाफ ऊपर जाना है और जॉन जीत:

UPDATE placements 
SET place = place +1 
WHERE user != "John"; 

UPDATE placements 
SET place = 1 
WHERE user = "John"; 

जॉन पहली जगह में है, और अन्य सभी को था एक स्थिति नीचे टक्कर लगी। अब आइए कहें कि जॉर्ज कार्ल के लिए कार्ल के पद पर है (वर्तमान में प्लेसमेंट # 4)। जॉर्ज जीता: इसका मतलब है कि जॉर्ज अब # 4 और कार्ल प्लेस # 5 है। जॉर्जेस की पुरानी स्थिति # 8 के साथ क्या होता है?

UPDATE placements 
SET place = place +1 
WHERE place > 3 
AND place < 9 
AND user != "George"; 

UPDATE placements 
SET place = 4 
WHERE user = "George"; 

तो, वास्तव में ऐसा करना मुश्किल नहीं है। आपको बस अपने कुछ उपयोगकर्ताओं के वर्तमान प्लेसमेंट को जानना होगा, और आवश्यकतानुसार अपने MySQL क्वेरीज को एडजस्ट करना होगा।

यदि आप इन प्रश्नों को अपने टर्मिनल या phpMyAdmin (या जो कुछ भी आप उपयोग करते हैं) में पेस्ट करते हैं, और साथ ही पालन करते हैं, तो आप देखेंगे कि यह काम करता है।