मुझे नहीं लगता कि MySQL में एक आसान तरीका है। ऐसा करने का एक तरीका है कि रेटिंग_नाम द्वारा समूहों में विभाजित प्रत्येक पंक्ति के लिए एक पंक्ति संख्या उत्पन्न करना, और उसके बाद केवल पंक्ति_संख्या 2 या उससे कम वाली पंक्तियों का चयन करें। अधिकांश डेटाबेस में आप कुछ इस तरह का उपयोग करके ऐसा कर सकते हैं:
SELECT * FROM (
SELECT
rating_name,
etc...,
ROW_NUMBER() OVER (PARTITION BY rating_name ORDER BY good) AS rn
FROM your_table
) T1
WHERE rn <= 2
दुर्भाग्य से, MySQL ROW_NUMBER
. का समर्थन नहीं करता है वाक्य - विन्यास। हालांकि आप ROW_NUMBER
का अनुकरण कर सकते हैं चर का उपयोग करना:
SELECT
rating_name, id_markets, good, neutral, bad
FROM (
SELECT
*,
@rn := CASE WHEN @prev_rating_name = rating_name THEN @rn + 1 ELSE 1 END AS rn,
@prev_rating_name := rating_name
FROM (
SELECT
rating_name,
id_markets,
SUM(COALESCE(rating_good, 0)) AS good,
SUM(COALESCE(rating_neutral, 0)) AS neutral,
SUM(COALESCE(rating_bad, 0)) AS bad
FROM zzratings
WHERE rating_year = YEAR(CURDATE()) AND rating_week = WEEK(CURDATE(), 1)
GROUP BY rating_name, id_markets
) AS T1, (SELECT @prev_rating_name := '', @rn := 0) AS vars
ORDER BY rating_name, good DESC
) AS T2
WHERE rn <= 2
ORDER BY rating_name, good DESC
आपके परीक्षण डेटा पर चलने पर परिणाम:
france 1 2 0 0 france 2 1 0 0 ireland 1 4 2 0 ireland 21 3 1 0 poland 1 3 1 0 poland 2 1 0 0