实际问题比这更复杂一点,所以这里是。
我有一个评论游戏的网站。每个游戏都会发布评分/评论,因此我有一个 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 来完成,但我确信一定有一种方法可以在一个查询中完成此操作。
感谢您的帮助。
最佳答案
这是我发现的一个丑陋的解决方案:
此查询仅获取您想要查看的评论的 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;
这应该有效。
关于mysql - 在 MySQL 中,我可以有一个表按评分返回最近评分的十个游戏吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/646696/