从 MySQL 获取分数 - 比子查询更好的选择?

Posted

技术标签:

【中文标题】从 MySQL 获取分数 - 比子查询更好的选择?【英文标题】:Getting scores from MySQL - better option than sub-queries? 【发布时间】:2012-09-17 14:31:46 【问题描述】:

我正在为一个朋友建立一个网站(一种爱好,而不是任何与职业/工作相关的东西),它将存储有关球员、比赛和分数的信息。我已经构建了大部分报告/统计信息,但我想显示玩家达到最高分数的次数,并且想知道我是否可以改进我的想法(基于子查询)。我的“分数”表是这样设置的:

scores(id、gameID、playerID、venueID、vsID、score1、score2、score3、score4、score5、total、seasonID)——所有的 xID 都是外键。

前提是每场比赛,每名球员都有一个新条目,所以我有 php 插入来自文本字段等的数据。这意味着假设一个赛季有 20 场比赛,并且 score1 'John Smith' 的最高得分为10 4 次那个赛季。但他在 score2 上也击中了 8 次,在 score3 上击中了 6 次等等(显然,这些可能在不同的游戏中)。所以在赛季结束时,我有一张大桌子,里面有很多结果(我有 240 行,因为每支球队有 12 名球员),当我查看我的统计数据时,我想知道有多少次约翰史密斯在那个赛季打出 10 分。我显然可以做 5 个查询(或 1 个带有子查询)并添加结果来告诉我这一点,但我想知道什么是最好的方法(或者如果你愿意,'SQL 大师'会使用的那个)纯粹是为了我自己的发展。

所以要结束:我希望运行我的查询并获得一个告诉我的结果集:

Name       | Total
John Smith | 12
Rob Smith  | 11
Will Smith | 11

等等... | 1

firstName 和 secondName 存储在“player”表中(通过 playerID 外键链接到“scores”表)。如果我愿意,我希望以后能够按需修改查询,例如,如果我想看看有多少次玩家得分为 9 而不是 10(但这显然可以通过通过 PHP 传递数字来完成)。

在此处搜索 (+ Google) 已将我引向“加入”路线,但我并没有取得多大成功。请问有什么帮助吗? :)

【问题讨论】:

只是好奇。字段 score1、score2、score3、score4 和 score5 包含什么?我想你每场比赛都会有一个分数。 如果您对数据进行标准化,这似乎会简单得多。创建一个子表来保存每个分数。 嗨,汤姆。这些字段包含每回合的分数 - 例如,3,5,4,8,7 并且在这种情况下有一个总字段包含 27。我希望为各种报告任务保存单独的回合分数,比如我的那个我试图实现。如果有更好的方法我想听听!由于我拥有的外键和其他表的数量,我有这种方式 - 似乎更容易......耸耸肩。 【参考方案1】:

我认为这应该可以解决问题:

SELECT playerID, COUNT(playerID) AS Total FROM (
SELECT playerID FROM scores WHERE score1='10' 
UNION ALL
SELECT playerID FROM scores WHERE score2='10'
UNION ALL
SELECT playerID FROM scores WHERE score3='10'
UNION ALL
SELECT playerID FROM scores WHERE score4='10'
UNION ALL
SELECT playerID FROM scores WHERE score5='10'
) AS thetable
GROUP BY playerID

10 是你想要的分数。

【讨论】:

确实有效!谢谢回复。简直不敢相信它是多么简单,真的:(【参考方案2】:

这将获得分别为 10 分的 playerID:

select 
    playerID,
    count(score1 = 10 or null) +
    count(score2 = 10 or null) +
    count(score3 = 10 or null) +
    count(score4 = 10 or null) +
    count(score5 = 10 or null)
    as total
from scores
group by playerID
having total > 0

将其加入玩家表以获取名称。

【讨论】:

也是一个可行的解决方案(但显然包括从未获得 X 分数的玩家。谢谢!:) @RickWalters Ok 添加了新要求。 谢谢 - 抱歉,虽然我不清楚。我只是说您的解决方案还包括执行此操作的能力(这也很有用!)。我接受了较早的答案,因为它确实有效,就像我说的那样,是第一个。我会看看在 14,000 条记录上两者的表现如何:)

以上是关于从 MySQL 获取分数 - 比子查询更好的选择?的主要内容,如果未能解决你的问题,请参考以下文章

mysql 查询语句可以使用的函数总结

使用子查询更新与使用连接更新 - 性能更好

从 MySQL 数据库中按最低分数获取行

SQL查询从列表中获取前“n”个分数

从使用 PHP 的 MySQL 数据库到 iPhone 的分数列表中获取排名

如何从游戏中心获取本地玩家分数