2010-03-19 10 views
7

एक mysql क्वेरी में परिणाम रैंकिंग करते समय संबंधों को कैसे संभालता है? मैं तालिका नाम और स्तंभ इस उदाहरण में सरल बना दिया है, लेकिन यह मेरी समस्या को वर्णन करना चाहिए:MySQL में परिणाम रैंकिंग करते समय मैं संबंधों को कैसे संभाल सकता हूं?

SET @rank=0; 

    SELECT student_names.students, 
      @rank := @rank +1 AS rank, 
      scores.grades 
    FROM student_names 
LEFT JOIN scores ON student_names.students = scores.students 
ORDER BY scores.grades DESC 

तो कल्पना से ऊपर क्वेरी का उत्पादन:

Students Rank Grades 
======================= 
Al   1  90 
Amy  2  90 
George  3  78 
Bob  4  73 
Mary  5  NULL 
William 6  NULL 

हालांकि अल और एमी एक ही है ग्रेड, एक दूसरे से अधिक रैंक किया गया है। एमी फट गया मैं इसे कैसे बना सकता हूं ताकि एमी और अल की रैंकिंग समान हो, ताकि दोनों के पास 1 रैंक हो। इसके अलावा, विलियम और मैरी ने टेस्ट नहीं लिया। उन्होंने कक्षा हासिल की और लड़के के कमरे में धूम्रपान कर रहे थे। उन्हें अंतिम स्थान के लिए बंधना चाहिए।

सही रैंकिंग होना चाहिए:

Students Rank Grades 
======================== 
Al   1  90 
Amy  1  90 
George  2  78 
Bob  3  73 
Mary  4  NULL 
William 4  NULL 

अगर कोई किसी भी सलाह है, तो कृपया मुझे बताएं।

उत्तर

16

संपादित: यह MySQL 4.1+ समर्थित है

उपयोग:

SELECT st.name, 
      sc.grades, 
      CASE 
      WHEN @grade = COALESCE(sc.grades, 0) THEN @rownum 
      ELSE @rownum := @rownum + 1 
      END AS rank, 
      @grade := COALESCE(sc.grades, 0) 
    FROM STUDENTS st 
LEFT JOIN SCORES sc ON sc.student_id = st.id 
    JOIN (SELECT @rownum := 0, @grade := NULL) r 
ORDER BY sc.grades DESC 

आप घोषित करने के लिए (MySQL, एक आंतरिक किसी भी मापदंड के बिना शामिल हों में) का उपयोग एक क्रॉस शामिल हो सकते हैं और एक चर का उपयोग एक अलग SET कथन का उपयोग किए बिना।

आपको एनयूएलएल को सही तरीके से संभालने के लिए कोलेस की आवश्यकता है।

+0

हाय ओएमजी टट्टू, आप MySQL टर्मिनेटर हैं !! बहुत बढ़िया, मदद के लिए बहुत बहुत धन्यवाद। मैंने इसे कभी नहीं सोचा होगा। (मेरा एसक्यूएल ज्ञान बुनियादी है, इसलिए इसे बेहतर समझने के लिए मुझे आपके उत्तर का अध्ययन करना होगा)। इसके अलावा, मुझे आपकी स्क्रीन का नाम पसंद है। फिर, धन्यवाद !!! -Laxmidi – Laxmidi

+0

"आप एक अलग एसईटी कथन का उपयोग किए बिना एक चर घोषित करने और उपयोग करने के लिए एक क्रॉस जॉइन (MySQL में, किसी भी मानदंड के बिना जॉइन जॉइन में) का उपयोग कर सकते हैं।" अरे, मुझे नहीं पता था कि आप ऐसा कर सकते हैं। +1 – heisenberg

+0

अगर मैं कर सकता तो मैं इसे फिर से वोट दूंगा। बहुत शानदार। – duffymo

1

एक मिडलवेयर नियम की तरह लगता है जो डेटाबेस और क्लाइंट के बीच बैठे कोड में बेहतर व्यक्त किया जाएगा।

यदि यह संभव नहीं है, तो मैं क्वेरी को चलाने के लिए MySQL में संग्रहीत प्रक्रिया की अनुशंसा करता हूं जैसा कि आपने लिखा था और फिर कर्सर और सरणी का उपयोग करके परिणामों को संशोधित करें।

+0

हाय डफिमो, आपकी टिप्पणी के लिए धन्यवाद। मैं मदद की सराहना करता हूं। -लैक्समिडी – Laxmidi

+0

ओएमजी टट्टू इस पर मैन है। क्या एक भयानक जवाब है। – duffymo

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