有没有办法将这些查询和计算结合起来?

时间:2019-04-20 08:17:42

标签: php mysql

当前,我的代码正在按预期工作,但是每次用户执行操作时,都会有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); 

第一个查询是获取给定用户的“活动团队”,并获取一个字符串,该字符串以4,7,8,10之类的形式存储团队成员ID。我知道标准做法是在每个团队成员的表上都有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); 

在这里,我使用团队列表来获取有关各个团队成员的信息。我想拥有这种替代结构可能会使合并前两个查询变得更加容易,因为我可以搜索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表上的teamid。假设我进行了更改,是否有办法将所有这些查询合并为一个?

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

您只需将第一个查询放入第二个查询中,然后删除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
)