2009-09-08 11 views
5

मेरे पास रिकॉर्ड की एक सूची है, और ऑर्डर नामक कॉलम है। मेरे पास एक पंक्ति को ऊपर या नीचे खींचने और ड्रॉप करने के लिए एक AJAX स्क्रिप्ट है जिसे मैं क्वेरी करने के लिए उपयोग करना चाहता हूं, पंक्तियों को फिर से घुमाने के रूप में खींच रहा हूं।पंक्तियों की एसक्यूएल मास रीडरिंग

PHP में, मैं रिकॉर्ड्स के वर्तमान क्रम को प्राप्त करने के लिए एक क्वेरी करता हूं। उदाहरण के लिए 1, 2, 3, 4 ड्रैग/ड्रॉप पूर्ण होने के बाद AJAX फ़ंक्शन नए ऑर्डर को पास करता है, उदाहरण के लिए 3, 1, 2, 4

क्या एक बार में रिकॉर्ड्स को फिर से ऑर्डर करने का एक आसान तरीका है , नए मूल्यों के आधार पर? एकमात्र अन्य विकल्प जो मैं देख सकता हूं अद्यतन अद्यतनों के माध्यम से लूपिंग है जैसे एसईटी ऑर्डर = 1 जहां ऑर्डर = 3

लेकिन निश्चित रूप से इसके परिणामस्वरूप 2 रिकॉर्ड समान मूल्य होंगे?

क्षमा करें, मुझे पता है कि यह विवरण थोड़ा उलझन में हो सकता है।

उत्तर

1

आप वास्तव में वापस जाना चाहते हैं और AJAX फ़ंक्शन परिणामों को देखना चाहते हैं। देखें कि क्या आप केवल नए सूची ऑर्डर के बजाय पुनर्वित्तित तत्वों की एक सूची प्राप्त कर सकते हैं।

आप सूची के पहले और बाद में दिए गए कोड में आपके लिए यह निर्धारित करने के लिए एक फ़ंक्शन (सी #/वीबी में) लिख सकते हैं। एक बार आपके पास डेल्टा परिवर्तन हो जाने के बाद, आप प्रति अपडेट एक अपडेट कमांड के साथ एक अपडेट लेनदेन जारी कर सकते हैं।

यदि आप केवल नए ऑर्डर के साथ काम करना चाहते हैं। नया ऑर्डर नामक एक नया कॉलम जोड़ने का प्रयास करें और इसे अपडेट करें। फिर थोक अद्यतन currentcolumn = newcolumn एक बार लूपिंग किया।

+0

यह काम करेगा, लेकिन आप के मामले में एक भी लेन-देन के भीतर सभी अद्यतन करने के लिए, चाहते हैं एकाधिक ग्राहक एक ही समय में ऑर्डर अपडेट कर रहे हैं। – MusiGenesis

6

आदेश आपकी प्राथमिक कुंजी नहीं होनी चाहिए; जहां खंड में प्राथमिक कुंजी का उपयोग कर अद्यतन करें।

यदि आप वास्तव में चाहते हैं तो आप इसे काफी लंबे केस केस स्टेटमेंट का उपयोग करके एक प्रश्न में कर सकते हैं। उदाहरण:

UPDATE foo 
    SET order = CASE order 
    WHEN 1 THEN 2 
    WHEN 2 THEN 3 
    WHEN 3 THEN 4 
    WHEN 4 THEN 5 
    END 
WHERE order IN (1,2,3,4) 

(याद रखें कि SQL कथन से 3 आदि से व्यवहार करते हैं जैसे कि वे सभी मूल्यों को एक साथ बदलने के लिए, ताकि 2 करने के लिए परिवर्तन 1 की तरह कुछ काम नहीं चलेगा, तो,)

+0

यह एक आम समाधान है। ऐसे मामलों में जहां एक बार फिर से व्यवस्थित होने के बाद बहुत सारी पंक्तियां होती हैं, यह अनावश्यक हो सकती है। उस स्थिति में, मैं इसके बजाय 'अगला' कॉलम रखना पसंद करता हूं, और इसे एक लिंक की गई सूची की तरह व्यवहार करता हूं। इससे अधिकतम तीन पंक्ति अपडेट तक किसी भी संभावित रीडरिंग ऑपरेशन को कम कर दिया जाता है। –

+0

@ ब्रेंट रॉकवुड वास्तव में। एक और दृष्टिकोण (अक्सर माइग्रेट करने में आसान) ऑर्डर 100, 200, 300 का उपयोग करना है, फिर आप आसानी से ऑर्डर 150 डाल सकते हैं। इससे बहुत कम मरम्मत की आवश्यकता कम हो जाती है। – derobert

1

यदि आप जानते हैं नई पंक्ति स्थिति में आप यह कर सकते हैं:

CREATE PROCEDURE [proc_UpdateCountryRowOrder] 
    @ID UNIQUEIDENTIFIER, 
    @NewPosition INT 
AS 

SET NOCOUNT ON 

DECLARE @CurrentPosition INT 
DECLARE @MaximumPosition INT 

IF (@NewPosition < 1) SET @NewPosition = 1 

SELECT @CurrentPosition = [Countries].[Order] 
FROM [Countries] 
WHERE [Countries].[ID] = @ID 

SELECT @MaximumPosition = MAX([Countries].[Order]) 
FROM [Countries] 

IF (@NewPosition > @MaximumPosition) SET @NewPosition = @MaximumPosition 

IF (@NewPosition <> @CurrentPosition) 
BEGIN 
    IF (@NewPosition < @CurrentPosition) 
    BEGIN 
     BEGIN TRAN 

     UPDATE [Countries] 
     SET [Countries].[Order] = [Countries].[Order] + 1 
     WHERE [Countries].[Order] >= @NewPosition 
     AND [Countries].[Order] < @CurrentPosition 

     UPDATE [Countries] 
     SET [Countries].[Order] = @NewPosition 
     WHERE ID = @ID 

     COMMIT TRAN 
    END 
    ELSE 
    BEGIN 
     BEGIN TRAN 

     UPDATE [Countries] 
     SET [Countries].[Order] = [Countries].[Order] - 1 
     WHERE [Countries].[Order] <= @NewPosition 
     AND [Countries].[Order] > @CurrentPosition 

     UPDATE [Countries] 
     SET [Countries].[Order] = @NewPosition 
     WHERE ID = @ID 

     COMMIT TRAN 
    END 
END 
GO 
0
कुछ

आप कर सकता है

तरह
BEGIN 
UPDATE Table SET order = order + 1 WHERE order >= new_pos 
UPDATE Table SET order = new_pos WHERE order = old_pos 
UPDATE Table SET order = order - 1 WHERE order < old_pos AND order > new_pos 
COMMIT; 

(untested, सिर्फ एक सूचक यह वह जगह है)

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