Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

MySQL मदद:अपडेट क्वेरी को ऑप्टिमाइज़ करें जो दूसरे कॉलम के क्रम के अनुसार रैंक सेट करती है

सबसे पहले, मैं 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 नहीं हैं। आप किसी अन्य डेटाबेस सिस्टम में जाने के विकल्प की जांच कर सकते हैं जो विंडो फ़ंक्शंस का समर्थन करता है, जैसे पोस्टग्रेज़, एसक्यूएल-सर्वर या ओरेकल।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. पीडीओ के लिए ट्राइ-कैच ब्लॉक का उपयोग कैसे करें

  2. mysql डेटाबेस में स्टोर करने से पहले टेक्स्ट को कंप्रेस करें

  3. ईमेल फील्ड के लिए सबसे अच्छा कैरेक्टर सेट कौन सा है?

  4. Apache DDLUtils का उपयोग किए बिना मैं एक डेटाबेस से दूसरे डेटाबेस में स्कीमा की प्रतिलिपि बनाने के लिए JDBC का उपयोग कैसे कर सकता हूं?

  5. MySQL में डेली एक्टिव यूजर्स (DAU) की गणना कैसे करें