如何使用PHP和MYSQL在逗号分隔的列表中查找前10个最受欢迎的值

我对所有这些都不熟悉,我已经在这里搜索并搜索过,但无济于事.使用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位的玩家,然后以这种格式将其打印到网站上,例如:

前10名玩家:

> a(已打50场比赛)
> f(打了39场比赛)
> o(已打20场比赛)
……

10克(进行2场比赛)

有谁知道如何做到这一点?任何帮助表示赞赏!老实说,没有这个网站,我什至无法参加我的项目!

最佳答案
我的建议是,不要在同一表中保留每个游戏的玩家列表,而是在游戏表和玩家表之间实现一种关系.

新模型可能如下所示:

桌上游戏:

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
..       ..

表格PlayersInGame:

id      idGame     idPlayer   current
1       1          1          true      //Player a is currently playing poker

当玩家开始游戏时,将其添加到PlayersInGame表中.

当玩家退出游戏时,将当前状态设置为false.

要检索玩家玩的游戏数量,请查询PlayersInGame表.

SELECT COUNT FROM PlayersInGame WHERE idPlayer=1

为了加快处理速度,您需要对表进行非规范化(实际上不是非规范化,但我不知道该怎么称呼),并在Players表中跟踪每个玩家的游戏数量.这将增加表的大小,但提供更好的速度.

因此,插入在Players中玩过的专栏游戏,然后查询:

SELECT * FROM Players ORDER BY games_played DESC LIMIT 10

编辑:

正如Ilmari Karonen所指出的那样,要想加快速度,您必须为games_played列创建一个INDEX.

转载注明原文:如何使用PHP和MYSQL在逗号分隔的列表中查找前10个最受欢迎的值 - 代码日志