获取某个阶段和级别的分数列表

时间:2015-04-28 12:42:09

标签: php mysql

对于我的游戏,我试图加入在线分数系统。 为了我的分数系统工作,我想从我的数据库中获得分数列表。 但由于我不熟悉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的玩家可以在表格中上传他想要的分数。

我希望我提供足够的信息,如有进一步的问题请发表评论。并提前感谢。

3 个答案:

答案 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