对于我的游戏,我试图加入在线分数系统。 为了我的分数系统工作,我想从我的数据库中获得分数列表。 但由于我不熟悉mysql状态,我不知道如何为我想要的东西编写查询。
我桌子的结构:http://prntscr.com/6z45bv
在我的查询中,我想返回我表格中的所有列和#34;得分"
SELECT * from scores
只有在php中使用GET请求给出的阶段和级别
WHERE stage = [number] AND level = [number]
根据我的要求,我希望获得从最高到最低排序的所有设备的最高单分。设备存储在" deviceid"柱
设备的最高分数是"爆炸点"(降序)的最高分数,其中"时间"(降序)最高。最高爆炸点数量最重要的地方。
以下是我想要的结果示例:
id, name, stage, level, blastpoints, time, badge, deviceid
5, "bob" 2 3 5 7123 true "asdakjhe"
1, "rick" 2 3 5 6321 false "3jkhasdl3"
8, "melissa" 2 3 4 8565 false "nlk43h2l"
2, "steven" 2 3 4 5678 true "342jhlad"
3, "freddy" 2 3 3 6721 false "1lk23jl1"
7, "hank" 2 3 2 5600 false "41asdg42"
在这个例子中,我检索了第2阶段第3级的分数。你可以看到爆炸点正在下降,它只能找到单个设备的最高分。
分数设置为具有特定设备ID的玩家可以在表格中上传他想要的分数。
我希望我提供足够的信息,如有进一步的问题请发表评论。并提前感谢。
答案 0 :(得分:2)
在SQL中,您可以使用ORDER BY
对结果进行排序。在这种情况下,因为您需要:
ORDER BY blastpoints DESC, time DESC
我们使用DESC
降序排列。这样,最高分出现在顶部。您在ORDER BY
中指定列名称的顺序也很重要,这就是我们根据您的示例首先指定 blastpoints 和 time 秒的原因。您也可以在ORDER BY
上阅读更多内容。
全部放在一起:
SELECT * FROM scores
WHERE stage = [number] AND level = [number]
ORDER BY blastpoints DESC, time DESC
答案 1 :(得分:1)
你需要做的是分组。按照唯一性进行分组,因此某些字段可以归类,因为它们只会导致问题。 id字段,例如你不能进行分组,但你可以得到它的min(),max()。
以下查询将显示每个级别和阶段的每个设备的最高分数。
SELECT
stage,
level,
deviceid,
max(blastpoints) score
FROM
scores
GROUP BY
stage,
level
deviceid
ORDER BY
level ASC,
stage ASC,
score DESC,
deviceid
此查询应该允许您考虑时间。
SELECT
min(s.id) id,
s.stage,
s.level,
hs.score,
s.time,
s.badge,
s.deviceid
FROM
scores s
INNER JOIN
(
SELECT
stage,
level,
deviceid,
max(blastpoints) score
FROM
scores
GROUP BY
stage,
level
deviceid
) hs ON
hs.deviceid = s.deviceid
AND hs.score = s.blastpoints
AND hs.stage = s.stage
AND hs.level = s.level
WHERE
s.stage = :stage
AND s.level = :level
GROUP BY
s.level,
s.stage,
hs.score,
s.time,
s.badge,
s.deviceid
ORDER BY
s.level ASC,
s.stage ASC,
hs.score DESC,
s.time,
s.deviceid
答案 2 :(得分:0)
在测试了Augwa的查询一段时间后,我发现它无法正常工作。 我自己做了一些试验和错误,并找到了正确的查询。
SELECT A.name,A.blastpoints,A.time,A.badge,A.deviceid
FROM (SELECT B.id,B.name,B.blastpoints,B.time,B.badge,B.deviceid
FROM scores B
WHERE B.stage = 0
AND B.level = 0
ORDER BY blastpoints DESC, time DESC) A
GROUP BY A.deviceid
ORDER BY A.blastpoints DESC, A.time DESC