सबसे पहले, मैं budget
बदलूंगा , cost
और rank_score
पूर्णांक या अन्य संख्यात्मक डेटाटाइप में और इसके बजाय
UPDATE table_name
SET rank_score = CONCAT(cost, budget) ;
तब आप उपयोग करेंगे:
UPDATE table_name
SET rank_score = cost * 1000 + budget * 1 ;
तब यह आसान हो जाता है क्योंकि आपको स्ट्रिंग फ़ंक्शंस से निपटने और कुछ ऐसा करने की आवश्यकता नहीं होगी:
SELECT *
FROM table_name
WHERE (conditions...)
ORDER BY rank_score DESC
(कोष्ठक:एक पैरामीटर होना (1000
.) ) दूसरे से इतना ऊंचा सेट करें (1
) cost, budget
. के आदेश के बराबर है . इसे जांचने के लिए प्रयास करें:
SELECT *
FROM table_name
ORDER BY cost DESC
, budget DESC
तो, आप rank_score
को अच्छी तरह से छोड़ सकते हैं कुल मिलाकर, जब तक कि आप निश्चित रूप से विभिन्न पैरामीटर मानों के साथ प्रयोग करने की योजना नहीं बनाते।
जैसा कि अन्य ने इंगित किया है, यह एक ऐसा क्षेत्र रखने का सर्वोत्तम अभ्यास नहीं है जो डेटा नहीं बल्कि गणना संग्रहीत करता है। यह डी-नॉर्मलाइजेशन है। इसके बजाय, आप तालिका को सामान्य रखते हैं और डेटाबेस को हर बार आपको इसकी आवश्यकता होने पर गणना करने देते हैं:
SELECT id, budget, cost,
cost*1000 + budget*1 AS rank_score_calculated
FROM table_name
ORDER BY rank_score_calculated DESC
rank_score_calculated
उपरोक्त उदाहरण में संग्रहीत नहीं है। इस तरह, आपको हर बार बजट या लागत बदलने या तालिका में एक नई पंक्ति जोड़ने पर परिकलित फ़ील्ड को अपडेट नहीं करना पड़ेगा।
केवल एक ही कमी है। यदि तालिका वास्तव में बड़ी है और आपको बहुत सारे उपयोगकर्ताओं द्वारा और बहुत बार उस क्वेरी (और गणना) की आवश्यकता है, और तालिका को अक्सर अपडेट किया जाता है, तो यह आपके डेटाबेस को धीमा कर सकता है। उस स्थिति में, ऐसे क्षेत्र को जोड़ने के बारे में सोचना शुरू कर देना चाहिए।
दूसरा मामला तब होता है जब किसी को पूर्ण rank
. की आवश्यकता होती है आपकी ज़रूरत की तरह सभी टेबल पंक्तियों में। चूंकि MySQL में कोई "विंडो" फ़ंक्शन नहीं है, इसलिए शुद्ध SQL में ऐसी क्वेरी लिखना बहुत कठिन है।)
रैंक की गणना MySQL वेरिएबल का उपयोग करके की जा सकती है
SELECT *
, @rownum:[email protected]+1 AS rank_calculated
FROM table_name
, (SELECT @rownum:=0) AS st
ORDER BY rank_score DESC
और अगर आप उन मानों को rank
. में रखना चाहते हैं , उपयोग करें:
UPDATE table_name
JOIN
( SELECT id
, @rownum:[email protected]+1 AS rank_calculated
FROM table_name
, (SELECT @rownum:=0) AS st
ORDER BY rank_score DESC
) AS r
ON r.id = table_name.id
SET table_name.rank = r.rank_calculated ;
उपरोक्त दो प्रश्न शुद्ध SQL नहीं हैं। आप किसी अन्य डेटाबेस सिस्टम में जाने के विकल्प की जांच कर सकते हैं जो विंडो फ़ंक्शंस का समर्थन करता है, जैसे पोस्टग्रेज़, एसक्यूएल-सर्वर या ओरेकल।