Ich glaube nicht, dass es in MySQL einen einfachen Weg gibt. Eine Möglichkeit, dies zu tun, besteht darin, eine Zeilennummer für jede Zeile zu generieren, die nach Bewertungsname in Gruppen unterteilt ist, und dann nur die Zeilen mit Zeilennummer 2 oder weniger auszuwählen. In den meisten Datenbanken können Sie dies folgendermaßen tun:
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
Leider unterstützt MySQL die ROW_NUMBER
nicht Syntax. Sie können jedoch ROW_NUMBER
simulieren Variablen verwenden:
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
Ergebnis bei Ausführung mit Ihren Testdaten:
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