इस प्रकार की क्वेरी को "महानतम-एन-प्रति-समूह" अर्थ में फिर से लिखा जा सकता है, जहां आप चाहते हैं कि प्रति "समूह" के शीर्ष 10 अंक 'फू' के मान हों।
मेरा सुझाव है कि आप यह लिंक जो इस प्रश्न से अद्भुत तरीके से निपटता है, एक ऐसे तरीके से शुरू करता है जो आपकी क्वेरी को निष्पादित करने और धीरे-धीरे इसे अनुकूलित करने के लिए समझ में आता है।
set @num := 0, @foo := '';
select foo, score
from (
select foo, score,
@num := if(@foo = foo, @num + 1, 1) as row_number,
@foo := foo as dummy
from tablebar
where foo IN ('abc','def')
order by foo, score DESC
) as x where x.row_number <= 10;
अगर आप इसे सभी में करना चाहते हैं foo
. के स्तर (यानी एक GROUP BY foo
करने की कल्पना करें ), आप where foo in ...
. को छोड़ सकते हैं लाइन।
मूल रूप से आंतरिक क्वेरी (SELECT foo, score FROM tablebar WHERE foo IN ('abc','def') ORDER BY foo, score DESC
) पकड़ लेता है foo
और score
तालिका से, पहले foo
. द्वारा आदेश देना और फिर अवरोही स्कोर करें।
@num := ...
बस हर पंक्ति को बढ़ाता है, foo
. के प्रत्येक नए मान के लिए 1 पर रीसेट करता है . यानी @num
सिर्फ एक पंक्ति संख्या/रैंक है (मेरा क्या मतलब है यह देखने के लिए आंतरिक क्वेरी को स्वयं चलाने का प्रयास करें)।
बाहरी क्वेरी तब उन पंक्तियों का चयन करती है जहां रैंक/पंक्ति संख्या 10 से कम या उसके बराबर होती है।
नोट:
UNION
. के साथ आपकी मूल क्वेरी डुप्लिकेट को हटा देता है, इसलिए यदि foo='abc'
. के लिए शीर्ष 10 स्कोर सभी 100 हैं तो केवल एक पंक्ति लौटाई जाएगी (चूंकि (foo,score)
जोड़ी को 10 बार दोहराया जाता है)। यह डुप्लिकेट लौटाएगा।