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