如何使用PHP& amp;找到逗号分隔列表中前10个最受欢迎的值MYSQL

时间:2011-10-08 12:07:33

标签: php mysql csv count

我是所有这一切的新手,我在这里用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名球员:

  1. a(50场比赛)
  2. f(39场比赛)
  3. o(已打20场比赛) ......
  4. 10克(2场比赛)

    有谁知道如何做到这一点?任何帮助表示赞赏!老实说,如果没有这个网站,我甚至不会在我的项目中出现这个展览会!

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列,请记住在其上创建一个索引 - 否则非规范化将不会为你带来任何好处。