Вот ужасное решение, которое я нашел:
Этот запрос просто получает идентификаторы и оценки отзывов, на которые вы хотите посмотреть. Я включил его, чтобы вы могли понять, в чем заключается хитрость, не отвлекаясь на другие вещи:
SELECT * FROM
(SELECT reviewID, ourScore FROM review ORDER BY postedOn DESC) as `r`
GROUP BY ourScore
ORDER BY ourScore DESC;
Это использует поведение MySQL «GROUP BY». Когда группирование выполнено, если исходные строки имеют разные значения для разных столбцов, то используется значение самой верхней исходной строки. Так что, если у вас были строки в следующем порядке:
reviewId Score
1 3
0 3
2 3
Затем, после того, как вы сгруппируете по количеству баллов, reviewId равно 1, потому что эта строка была сверху:
reviewId Score
1 3
Таким образом, мы хотим поставить самый последний обзор сверху, прежде чем мы сделаем группу. Поскольку ORDERing всегда выполняется после группировки, в одном операторе SELECT мне пришлось выполнить подзапрос, чтобы выполнить это. Теперь мы просто немного украсим этот запрос, чтобы получить все необходимые поля:
SELECT `r`.*, game.gameName, game.gameImage FROM
(SELECT reviewID, ourScore, postedOn, gameID FROM review ORDER BY **postedOn DESC**) as `r`
JOIN game ON `r`.gameID = game.gameID
GROUP BY ourScore
ORDER BY ourScore DESC;
Это должно сработать.