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

标签 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。假设我进行了更改,有没有一种方法可以将所有这些查询合并为一个?

最佳答案

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

关于php - 有没有办法将这些查询和计算结合起来?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55771628/

相关文章:

javascript - ajax 表单无法正常工作

php - Apache 在 Mavericks 上运行错误版本的 PHP

php - 如何在 Ikariam (MMORPGs) 中创建像 'build building' 这样的函数,当用户不在网站上时它会继续计数

php - 使用 JQuery 从 post() 接收响应

mysql - MySQL中的CHECK约束不起作用

mysql - 在这种情况下我该如何重写 COUNT 的正确语句

php - 您如何解决带有分页的页面上的重复标题/元标记?最佳实践是什么?

php - 搜索查询的结果

php - 未捕获的 ActiveRecord\UndefinedPropertyException codeigniter

mysql - 发现重复键时使用 MySQL 触发器更新另一个表