Могу ли я иметь в MySQL таблицу, возвращающую десять последних рейтинговых игр по рейтингу? - PullRequest
2 голосов
/ 14 марта 2009

Фактический вопрос немного сложнее, так что вот так.

У меня есть сайт, на котором есть обзоры игр. Рейтинги / обзоры публикуются для каждой игры, поэтому у меня есть база данных MySQL, чтобы справиться со всем этим.

Дело в том, что мне бы очень хотелось, чтобы на странице была показана оценка того, что означало (из 10), и чтобы проиллюстрировать это, в качестве примера была бы игра, которую последний раз рассматривали . Я всегда могу сделать это без, но это было бы круче.

Таким образом, запрос должен возвращать что-то вроде этого (но работает с 10 до 0):

|---------------*----------------*-----------------*-----------------|
* game.gameName | game.gameImage | review.ourScore | review.postedOn *
|---------------*----------------*-----------------*-----------------|
| Top Game      | img            | 10              | (unix timestamp)|
| NearlyTop Game| img            | 9               | (unix timestamp)|
| Great Game    | img            | 8               | (unix timestamp)|
|---------------*----------------*-----------------*-----------------|

Информация в двух таблицах: игра и обзор. Я думаю, что вы будете использовать MAX (), чтобы узнать последнюю временную метку и соответствующую информацию об игре, но что касается сложных запросов, то я над головой.

Конечно, это можно сделать с помощью 10 простых SELECT, но я уверен, что должен быть способ сделать это в одном запросе.

Спасибо за любую помощь.

Ответы [ 4 ]

3 голосов
/ 15 марта 2009

Вот ужасное решение, которое я нашел:

Этот запрос просто получает идентификаторы и оценки отзывов, на которые вы хотите посмотреть. Я включил его, чтобы вы могли понять, в чем заключается хитрость, не отвлекаясь на другие вещи:

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;

Это должно сработать.

0 голосов
/ 15 марта 2009

Ну ..

SELECT game.gameName, game.gameImage, review.ourScore
FROM game
LEFT JOIN review ON game.gameID = review.gameID
GROUP BY review.ourScore DESC 
LIMIT 10

возвращает список игр, сгруппированных по каждому отдельному счету. Но это не то, чего я хочу, я хочу, чтобы игра была опубликована в последний раз, поэтому важна временная метка. С этим запросом MySQL возвращает первый найденный результат.

0 голосов
/ 15 марта 2009

Я думаю, что это будет работать:

select g.gameName, g.gameImage, r.ourScore, r.postedOn
from game g, review r
where g.gameId = r.gameId 
and r.postedOn = (select max(sr.postedOn) 
                  from review sr where sr.ourScore = r.ourScore)
group by r.ourScore
order by r.ourScore desc;

Редактировать : выше SQL был исправлен после комментария Дэвида Грейсона. Я думаю, что этот запрос довольно прост для понимания, но, вероятно, работает плохо по сравнению с его решением.

0 голосов
/ 14 марта 2009
SELECT DISTINCT game.gameName, game.gameImage, review.ourScore FROM game
LEFT JOIN review
ON game.ID = review.gameID
ORDER BY review.postedOn
LIMIT 10

Или что-то в этом роде, сначала проверьте, как использовать Distinct, я не уверен в синтаксисе, и вам может потребоваться указать ORDER BY DESC или ASC в зависимости от того, что вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...