当前,我的代码正在按预期工作,但是每次用户执行操作时,都会有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。假设我进行了更改,是否有办法将所有这些查询合并为一个?
答案 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
)