实际问题比这更复杂,所以这里就是。
我有一个评论游戏的网站。每个游戏都会发布评分/评论,因此我有一个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来完成,但我确信必须有一种方法可以在一个查询中执行此操作。
感谢您的帮助。
答案 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发表评论后得到纠正。我认为这个查询很容易理解,但与他的解决方案相比可能表现不佳。