将2个mysql查询合并为一个?

时间:2012-11-11 16:47:17

标签: php mysql

我有一个多人游戏网站,用户可以每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 - 文本 invite - int(11) random - int(11) active - 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) username - varchar(255) 密码 - varchar(50) profileimg - varchar(25) country - int(11) 注册 - 日期 日期 - 时间戳

希望这有意义并希望得到帮助: - )

1 个答案:

答案 0 :(得分: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");