Php 计算总分
我有一个包含这些表的数据库Php 计算总分,php,mysqli,triggers,Php,Mysqli,Triggers,我有一个包含这些表的数据库 users(name, team_id, overall_user_score) teams(id, name, team_score, totalscore) 我如何在每次更新后触发运行,其中its会获取团队中所有用户的分数和该团队的team_分数,然后将它们相加,并将其放入totalscore 我没有任何触发器的代码。我有php来显示总分,仅此而已 function showTeamScore() { require "connect.php";
users(name, team_id, overall_user_score)
teams(id, name, team_score, totalscore)
我如何在每次更新后触发运行,其中its会获取团队中所有用户的分数和该团队的team_分数,然后将它们相加,并将其放入totalscore
我没有任何触发器的代码。我有php来显示总分,仅此而已
function showTeamScore() {
require "connect.php";
$score = mysqli_query($connection, "SELECT *
FROM teams
WHERE id = '".$_GET['id']."'") or die(mysqli_error($connection));
while ($data = mysqli_fetch_array($score)) {
echo $data['overall_score'];
}
}
编辑:代码和问题更新
mysqli_query($connection, "UPDATE teams SET totalscore=overall_score+IFNULL((SELECT sum(overall_user_score) FROM users WHERE team_id=id),0)") or die(mysqli_error($connection));
一个简单的子查询就可以做到这一点:
-- query #1
SELECT id, tname,
(SELECT sum(uscore) FROM usr WHERE tid=id) tscore
FROM teams ORDER BY id
您可以直接运行此选择,也可以为其定义视图
如果您只想要总分,您可以简单地执行以下操作:
-- query #2
SELECT SUM(uscore) total_score FROM usr
或者,结合前面的团队列表:
-- query #3 (combination of #1 and #2)
SELECT id, tname,(SELECT sum(uscore) FROM usr WHERE tid=id) tscore
FROM teams
UNION ALL
SELECT 999,'total score all teams',SUM(uscore) FROM usr
ORDER BY id
对于-Demo之类的示例数据,请参见此处:
小组:
id tname
1 Dallas
2 Houston
3 Austin
usr:
您将从查询3中获得此结果:
id tname tscore
1 Dallas 28
2 Houston 11
3 Austin
999 total score all teams 39
好的,如果您想在最后一列中看到所有用户及其各自的团队分数,您可以这样做
-- query #4
SELECT uid, name,uscore,(SELECT sum(uscore) FROM usr WHERE tid=u.tid) tuscore
FROM usr u
这将导致
uid name uscore tuscore
1 Paul 10 28
2 Mary 3 28
3 Harry 7 11
4 Frank 4 11
5 Lisa 15 28
全新的答案:
您可能需要这样的更新选择4a或4b:
-- query #4a
UPDATE teams t INNER JOIN
(SELECT tid, SUM(uscore) usc FROM usr GROUP BY tid) u ON u.tid=t.id
SET t.tsc=t.tsc+u.usc
或者请看这里:
其中个人用户贡献uscore将添加到团队总分tsc中。在团队中只有一个得分栏是有意义的
与以前的几十
id tname tsc
1 Dallas 20
2 Houston 7
3 Austin 18
然后,上面列出的用户贡献将计算新的团队总分
id tname tsc
1 Dallas 48
2 Houston 18
3 Austin 18
之后,应重置用户分数,以避免重复计算。做
UPDATE usr SET uscore=0
或者,您可以在用户表中设置无效标志,如果你仍然想看到最后的分数,但不想再次计算它。你能显示你当前的查询吗?@MHakvoort我没有任何TiggerMay的代码你不需要触发器,但你可以用合适的视图来做同样的事吗?@cars10触发器会不容易吗?触发器会尝试保持一个冗余表的最新状态,并承担让所有其他用户在it开展业务时等待。视图不具欺骗性,只会查看最新的原始数据,并在需要时进行组合。这只是将用户分数相加。我如何将团队的总分数添加到tscore。另外,如果将团队id设置为1,那么这将重复相同的分数4次,因为有4个团队?请解释一下底部的查询。在我看来,这就像第一个查询,它只是将特定团队中所有用户的分数相加好的,但是团队有自己的分数,我希望将其添加到用户分数的总和中。嗯,我总共提出了三个查询:1。每队得分2分。全队总分3分。最后一行是1和2个团队分数和总分的组合。您确实这样做了,但我最初的问题是询问团队中所有用户的分数和该团队的团队分数,然后将它们相加,并将其放入totalscore
id tname tsc
1 Dallas 48
2 Houston 18
3 Austin 18
UPDATE usr SET uscore=0