1

我有一个多人游戏网站,用户每 20 秒就会获得一次这样的游戏列表:

$sql1 = mysql_query("SELECT gp.fk_game_id, gp.player_tiles, gp.infoPop, gp.chatbadge, g.lastdraw FROM ".$prefix."_gameplayer gp
                        INNER JOIN ".$prefix."_games g ON gp.fk_game_id = g.game_id
                    WHERE gp.fk_player_id = $currplayer AND g.invite=0 AND g.deleteby != $currplayer ORDER BY g.lastdraw ASC");  

while($row1 = mysql_fetch_assoc($sql1)){

    $gameid = $row1['fk_game_id'];

    // GET CURRENT GAME OPPONENT ID AND BOARD DATA //
    $sql = mysql_query("SELECT gp.fk_player_id
                              ,gp.last_draw_type
                              ,gp.player_turn
                              ,u.country
                              ,u.username
                              ,u.profileimg
                        FROM ".$prefix."_gameplayer gp
                            INNER JOIN ".$prefix."_users u
                                ON gp.fk_player_id = u.id
                         WHERE gp.fk_player_id!=$currplayer AND gp.fk_game_id=$gameid");
    $row = mysql_fetch_assoc($sql);

如果一个玩家有 30 场比赛,由于 while 循环中的 mysql_query,它会使用大量资源。

每个游戏都存储在 3 行的 2 个 db 表中。

一个包含游戏数据的游戏表行和 2 个游戏玩家表行,一个用于当前玩家,一个用于对手。

这是我必须为其运行第二次查询的对手的行。

是否可以将此行加入到第一个查询中,以便我每 20 秒只为玩家运行一次查询?

表模式如下:

桌面游戏 game_id - int(11) 邀请时间 - 时间戳 lastdraw - 时间戳 timetodraw - 日期时间 bag_tiles - 文本 table_tiles - 文本 new_tiles - 文本邀请 - int(11) 随机 - int(11) 活动 - int(11) 完成 - int(11) deleteby - int(11) warn1 - int(11) warn2 - int(11)

表游戏玩家 id - int(11) fk_game_id - int(11) fk_player_id - int(11) player_tiles - 文本 player_draws - int(11) first_draw - int(11) player_turn - int(11) last_draw_type - int(11) player_passes - int (11) swapped - int(11) player_win - int(11) player_points - int(11) infoPop - int(11) chatbadge - int(11)

表用户 id - int(11) 电子邮件 - varchar(255) 用户名​​ - varchar(255) 密码 - varchar(50) profileimg - varchar(25) 国家 - int(11) 注册 - 日期 date - 时间戳

希望这是有道理的,并希望得到帮助:-)

4

1 回答 1

1

您可以尝试以下方法:

 $sql1 = mysql_query("SELECT gp.fk_player_id,gp.last_draw_type,gp.player_turn, u.country,u.username,u.profileimg,
                    gp.fk_game_id, gp.player_tiles, gp.infoPop, gp.chatbadge, g.lastdraw FROM ".$prefix."_gameplayer gp
                    INNER JOIN ".$prefix."_games g ON gp.fk_game_id = g.game_id 
                    INNER JOIN ".$prefix."_users u ON gp.fk_player_id = u.id
                    WHERE g.invite=0 AND g.deleteby != $currplayer 
                    AND gp.fk_game_id=$gameid ORDER BY g.lastdraw ASC");
于 2012-11-11T16:59:34.530 回答