2010-01-28 18 views
5

मेरे पास ऐसा लगता है कि 'हाईस्कॉरेस' नामक एक टेबल है।MySQL तालिका में एक रैंक प्रदर्शित करना

id  udid  name  score 
1  1111  Mike  200 
2  3333  Joe  300 
3  4444  Billy  50 
4  0000  Loser  10 
5  DDDD  Face  400 

एक विशिष्ट उडिड को देखते हुए, मैं उस पंक्ति के रैंक को उनके स्कोर मूल्य से वापस करना चाहता हूं।

यानी अगर UDID दिया = 0000, मैं 5.

लौट जाना किसी भी विचार कैसे एक MySQL डेटाबेस के लिए इस क्वेरी लिखने के लिए?

उत्तर

7

MySQL किसी भी विश्लेषणात्मक/रैंकिंग सुविधा उपलब्ध नहीं है, लेकिन आप कृत्रिम रूप से एक रैंक मान बनाने के लिए एक चर का उपयोग कर सकते हैं:

SELECT t.id, 
     t.udid, 
     t.name, 
     t.score, 
     @rownum := @rownum + 1 AS rank 
    FROM HIGHSCORES t 
    JOIN (SELECT @rownum := 0) r 
ORDER BY t.score DESC 

आदेश क्या रैंक UDID "0000", उपयोग के साथ जुड़ा हुआ है को देखने के लिए :

SELECT MAX(x.rank) AS rank 
    FROM (SELECT t.id, 
       t.udid, 
       t.name, 
       t.score, 
       @rownum := @rownum + 1 AS rank 
      FROM HIGHSCORES t 
      JOIN (SELECT @rownum := 0) r 
     ORDER BY t.score DESC) x 
WHERE x.udid = '0000' 

यदि उपयोगकर्ता कई उच्च स्कोर मान हैं की आवश्यकता MAX। वैकल्पिक रूप से, आप MAX का उपयोग नहीं कर सके और ORDER BY rank LIMIT 1 का उपयोग करें।

+0

आह धन्यवाद, वहाँ प्रति केवल 1 प्रविष्टि है उदित, मैं अपनी PHP लिपि में इसका ख्याल रखता हूं। भी, मैं इसके बारे में थोड़ा जानता हूं। तो दोनों ब्लॉक एक साथ कैसे काम करते हैं। क्या मैं उन्हें एक ही प्रश्न में डालता हूं? या एक दूसरे के ठीक बाद? –

+0

@MichaelInno: यदि आप केवल एक विशिष्ट उपयोगकर्ता रैंक की जांच कर रहे हैं, तो आपको केवल दूसरी क्वेरी का उपयोग करने की आवश्यकता है। '0000'' को जो भी' उदिद 'आप ढूंढ रहे हैं उसे बदलें। –

+0

यह आपको एक ही स्कोर वाले उपयोगकर्ताओं के लिए अलग-अलग रैंक देगा। –

1

OMG की उत्कृष्ट जवाब जो UDID प्रति कई उच्च स्कोर के सामान्य मामला है दोहराना के लिए, यहाँ UDID प्रति ठीक एक प्रवेश की पूर्व शर्त के आधार पर क्वेरी है:

SELECT rank 
FROM 
    (SELECT @rownum := @rownum + 1 AS rank, score, udid 
    FROM highscores 
    JOIN (SELECT @rownum := 0) r 
    ORDER BY highscores.score DESC) x 
WHERE x.udid = '0000' 
संबंधित मुद्दे