有没有办法组合这些查询和计算?

目前,我的代码可以按预期工作,但是每次用户执行操作时,都会有3个查询。我必须想象有一种方法可以将其减少到2个甚至1个查询,以减少服务器上的负载。


$qry = "SELECT 

    `team`.`teamlist` AS 'team' 

FROM  

    `user`  

INNER JOIN 

    `team` 

ON 

    `user`.`team` = `team`.`teamid` 

WHERE 

    `user`.`userid` = " . $userid; 

$result = $db->query_first($qry); 

第一个查询是获取给定用户的“活动团队”,并获取一个字符串,该字符串以形式存储团队成员ID 4,7,8,10。我知道标准做法是在每个团队成员的表上都有team_id,然后以这种方式联接表。但是,这就是当前系统的设置方式,我将不得不修改许多代码行才能以这种方式实现。


$vals = explode(',',$result['team']); 

$ids = implode("','",$vals); 

对于下一个查询,这基本上只是在每个值周围添加单引号。


$qry2 = "SELECT  

    `indv`.`indvid` AS 'id',  

    `indv`.`level` AS 'level',  

    `indv`.`exp` AS 'exp' 

FROM   

    `indv`   

WHERE  

    `indv`.`indvid` IN ('" . $ids . "')"; 

$result2 = $db->query_read($qry2); 

在这里,我使用团队列表来获取有关各个团队成员的信息。我想拥有这种替代结构可能会使合并前两个查询更加容易,因为我可以搜索where indv.teamid = user.team。


while($resultLoop = $db->fetch_array($result2)) {  

  $lvl = $resultLoop['level']; 

  $next_lvl = round((($lvl+1)*($lvl+1))/2,0); 

  $rlvl = ($resultLoop['exp'] == $next_lvl-1) ? $lvl+1 : $lvl; 

  $str .= "when `indvid` = " . $resultLoop['id'] . " then " . $rlvl . "  

"; 

}  

这是我想完全在SQL中完成的主要部分。这是一个相对简单的公式,适用于每个团队成员。


$qry3 = "UPDATE `indv` 

    SET `level` = (case " . $str . " 

                    end), 

        `exp` = `exp` + 1 

    WHERE `indvid` in ('" . $ids . "')"; 

$db->query_write($qry3); 

实际上,最终查询如下所示:


UPDATE 

    `indv` 

SET 

    `level` = (case when `indvid` = 13 then 4 

                    when `indvid` = 16 then 4 

                    when `indvid` = 29 then 4 

                    when `indvid` = 32 then 5 

                    when `indvid` = 34 then 4 

                    when `indvid` = 48 then 6 

                end), 

    `exp` = `exp` + 1 

WHERE 

    `indvid` in ('13','16','29','32','34','48')

当我有更多时间时,我确实打算修改所有内容以在桌子上使用队友indv。假设我进行了更改,是否可以将所有这些查询组合为一个查询?


ITMISS
浏览 125回答 2
2回答

翻阅古今

您可以简单地将第一个查询放入第二个查询中,并删除php操作以添加单引号。SELECT      `indv`.`indvid` AS 'id',      `indv`.`level` AS 'level',      `indv`.`exp` AS 'exp' FROM       `indv`   WHERE      `indv`.`indvid` IN (SELECT     `team`.`teamlist`FROM      `user`  INNER JOIN     `team` ON     `user`.`team` = `team`.`teamid` WHERE     `user`.`userid` = $userid)

慕婉清6462132

您可以尝试子查询合并第一和第二查询的结果SELECT * FROM table_name WHERE id IN (SELECT id FROM `table_name`)所以您的查询看起来像SELECT   `indv`.`indvid` AS 'id',   `indv`.`level` AS 'level',   `indv`.`exp` AS 'exp' FROM    `indv`   WHERE   `indv`.`indvid` IN (SELECT  `team`.`teamlist` AS 'team' FROM   `user`  INNER JOIN  `team` ON  `user`.`team` = `team`.`teamid` WHERE  `user`.`userid` = " . $userid)";
打开App,查看更多内容
随时随地看视频慕课网APP