我是所有这一切的新手,我在这里用Google搜索并搜索,但无济于事。使用谷歌和这里的一些回复,我设法解决了一个单独的问题,但这是我真正感兴趣的,我想知道这是否可能/如何实现它。
我有mysql表,如下所示:
id type of game players timestamp
1 poker a,b,c,d,e,f,g,h 2011-10-08 08:00:00
2 fencing i,j,k,l,m,n,o,p 2011-10-08 08:05:00
3 tennis a,e,k,g,p,o,d,z 2011-10-08 08:10:00
4 football x,y,f,b 2011-10-08 08:15:00
有7种类型的游戏,每种游戏类型用逗号分隔4或8个玩家。 然而,玩家是IRC的昵称,因此可能会有新的玩家一直拥有独特的昵称。
我想要做的是查看整个牌桌的玩家专栏,并根据比赛类型找到前10名玩家,无论游戏类型如何,并以此格式打印到网站,例如:< / p>
10克(2场比赛)
有谁知道如何做到这一点?任何帮助表示赞赏!老实说,如果没有这个网站,我甚至不会在我的项目中出现这个展览会!
答案 0 :(得分:3)
我的建议是你不要在同一个表中保留每个游戏的玩家列表,而是实现games
表和players
表之间的关系。
新模型可能如下:
TABLE游戏:
id type of game timestamp
1 poker 2011-10-08 08:00:00
2 fencing 2011-10-08 08:05:00
3 tennis 2011-10-08 08:10:00
4 football 2011-10-08 08:15:00
乒乓球运动员:
id name
1 a
2 b
3 c
.. ..
TABLE PlayersInGame:
id idGame idPlayer current
1 1 1 true //Player a is currently playing poker
当玩家开始游戏时,将其添加到PlayersInGame
表。
当玩家退出游戏时,请将current
状态设置为false
。
要检索玩家所玩游戏的数量,请查询PlayersInGame
表。
SELECT COUNT FROM PlayersInGame WHERE idPlayer=1
为了加快处理速度,您需要对表进行反规范化(实际上不是非规范化,但我不知道还有什么可以称之为)表,并跟踪Players
表中每个玩家的游戏数量。这会增加表格大小但提供更好的速度。
所以插入在玩家中播放的列游戏并在此之后进行查询:
SELECT * FROM Players ORDER BY games_played DESC LIMIT 10
编辑:
正如Ilmari Karonen指出的那样,为了提高速度,您必须为INDEX
列创建games_played
。
答案 1 :(得分:0)
除非您拥有巨大数量的玩家,否则您可能不需要在Luchian Grigore's answer结尾处建议的非规范化步骤。假设表格按照他最初的建议构建,并且PlayersInGame (idPlayer)
上的索引,以下查询应该相当快:
SELECT
name,
COUNT(*) AS games_played
FROM
PlayersInGame AS g
JOIN Players AS p ON p.id = g.idPlayer
GROUP BY g.idPlayer
ORDER BY games_played DESC
LIMIT 10
这确实需要一个文件分区,但仅限于分组数据,所以它的性能只取决于玩家的数量,而不是游戏的数量。
聚苯乙烯。如果你最终在播放器表中添加了一个明确的games_played
列,请记住在其上创建一个索引 - 否则非规范化将不会为你带来任何好处。