निम्नलिखित विधि इस तथ्य पर निर्भर करती है कि possessions
तालिका में एक प्राथमिक कुंजी होती है और citizen_id
उसका हिस्सा नहीं है। ये रहा आइडिया:
-
अपडेट के सभी पैरामीटर डालें (
citizen_id
औरgood_id
फ़िल्टर करने के लिए,citizen_id
. के नए मान और अद्यतन करने के लिए पंक्तियों की संख्या) कुछ भंडारण, एक समर्पित तालिका, शायद, या एक अस्थायी तालिका में। -
possessions
को पंक्ति क्रमांक असाइन करें(citizen_id, good_id)
. पर पंक्तियों का विभाजन , फिरcitizen_id
पर मूल पूर्ण सेट को फ़िल्टर करने के लिए पैरामीटर तालिका में सेट की गई रैंक वाली पंक्ति में शामिल हों औरgood_id
, साथ ही पंक्तियों की संख्या। -
possessions
में शामिल हों और प्राथमिक कुंजी मानों पर पिछले जुड़ाव का परिणाम औरcitizen_id
. को अपडेट करें नए मूल्यों के साथ।
MySQL के SQL में, उपरोक्त कुछ इस तरह दिख सकता है:
UPDATE possessions AS p
INNER JOIN
(
SELECT
@r := @r * (@c = p.citizen_id AND @g = p.good_id) + 1 AS r,
p.possession_id,
@c := p.citizen_id AS citizen_id,
@g := p.good_id AS good_id
FROM
possessions AS p
CROSS JOIN
(SELECT @r := 0, @c := 0, @g := 0) AS x
ORDER BY
p.citizen_id,
p.good_id
) AS f ON p.possession_id = f.possession_id
INNER JOIN
possession_updates AS u ON u.citizen_id = f.citizen_id AND u.good_id = f.good_id
SET
p.citizen_id = u.new_citizen_id
WHERE
f.r <= u.row_count
;
possessions_update
पैरामीटर मान वाली तालिका है।
क्वेरी पंक्ति क्रमांकन की एक ज्ञात विधि का उपयोग करती है जो चर को नियोजित करती है, जिसे f
. में कार्यान्वित किया जाता है सबक्वेरी।
मेरे पास MySQL नहीं है इसलिए मैं प्रदर्शन के दृष्टिकोण से इसका ठीक से परीक्षण नहीं कर सकता, लेकिन कम से कम आप यह SQL Fiddle डेमो
कि यह तरीका काम करता है। (अपडेट स्टेटमेंट स्कीमा स्क्रिप्ट में है, क्योंकि SQL फिडल MySQL के लिए राइट-साइड स्क्रिप्ट में डेटा मॉडिफिकेशन स्टेटमेंट की अनुमति नहीं देता है। राइट साइड सिर्फ possessions
के पोस्ट-अपडेट कंटेंट को लौटाता है। ।)