在MySQL中,我可以通过评级返回十个最后评级的游戏吗?

时间:2009-03-14 20:46:38

标签: mysql

实际问题比这更复杂,所以这里就是。

我有一个评论游戏的网站。每个游戏都会发布评分/评论,因此我有一个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 个答案:

答案 0 :(得分:3)

我发现这是一个丑陋的解决方案:

此查询只会获取您要查看的评论的ID和分数。我已经把它包括在内,这样你就可以理解诀窍是什么,而不会被其他东西分心:

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;

这应该有效。

答案 1 :(得分:0)

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。

答案 2 :(得分:0)

嗯..

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返回它可以找到的第一个结果。

答案 3 :(得分:0)

我认为这样可行:

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在David Grayson发表评论后得到纠正。我认为这个查询很容易理解,但与他的解决方案相比可能表现不佳。