为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
ITMISS 2021-05-02 12:19:18
目前,我的代码可以按预期工作,但是每次用户执行操作时,都会有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。假设我进行了更改,是否可以将所有这些查询组合为一个查询?
查看完整描述

2 回答

?
翻阅古今

TA贡献1780条经验 获得超5个赞

您可以简单地将第一个查询放入第二个查询中,并删除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

)


查看完整回答
反对 回复 2021-05-07
?
慕婉清6462132

TA贡献1804条经验 获得超2个赞

您可以尝试子查询合并第一和第二查询的结果


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)";


查看完整回答
反对 回复 2021-05-07
  • 2 回答
  • 0 关注
  • 124 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信