MySQL如何从多条详细记录中更新1条主记录
我有两张桌子——一张主桌和一张明细桌。这是一个1对多的关系之间的主和细节 在许多其他列中,主表包括: 在许多其他列中,“详细信息”表包括: SQL UPDATE语句将这两个表连接在一起,并使用details.value之和更新master.total,其中master.id=details.id可能是什么样子的 谢谢你的帮助。看起来像:MySQL如何从多条详细记录中更新1条主记录,mysql,sql,Mysql,Sql,我有两张桌子——一张主桌和一张明细桌。这是一个1对多的关系之间的主和细节 在许多其他列中,主表包括: 在许多其他列中,“详细信息”表包括: SQL UPDATE语句将这两个表连接在一起,并使用details.value之和更新master.total,其中master.id=details.id可能是什么样子的 谢谢你的帮助。看起来像: UPDATE master m INNER JOIN ( SELECT d.id, SUM(d.value) AS valueSum FR
UPDATE
master m
INNER JOIN
(
SELECT d.id, SUM(d.value) AS valueSum
FROM details
GROUP BY d.id
) AS g
ON m.id = g.id
SET m.total = g.valueSum
看起来像:
UPDATE
master m
INNER JOIN
(
SELECT d.id, SUM(d.value) AS valueSum
FROM details
GROUP BY d.id
) AS g
ON m.id = g.id
SET m.total = g.valueSum
下面是我最后的SELECT语句的最终结果:
// update all scored nominations "total score" and "average score" for current year where nomination approved and not locked
mysql_query('
UPDATE nomination_bak AS nomination
SET
nomination_score = (
SELECT SUM(total_score)
FROM essayScores_bak AS essayScores
WHERE essayScores.nomination_sequence = nomination.nomination_sequence AND essayScores.nomination_year = nomination.nomination_year
),
nomination_average = (
SELECT AVG(total_score)
FROM essayScores_bak AS essayScores
WHERE essayScores.nomination_sequence = nomination.nomination_sequence AND essayScores.nomination_year = nomination.nomination_year AND essayScores.total_score > "0"
)
WHERE nomination.nomination_year = "' . NOMINATION_YEAR . '" AND nomination.nomination_approved = "Y" AND nomination.nomination_locked = "N"
') or die('tallyScores(nominationTable): ' . mysql_error());
每个表的_-bak部分都显示了我在表的备份副本上测试的结果。下面是我最后的SELECT语句的结果:
// update all scored nominations "total score" and "average score" for current year where nomination approved and not locked
mysql_query('
UPDATE nomination_bak AS nomination
SET
nomination_score = (
SELECT SUM(total_score)
FROM essayScores_bak AS essayScores
WHERE essayScores.nomination_sequence = nomination.nomination_sequence AND essayScores.nomination_year = nomination.nomination_year
),
nomination_average = (
SELECT AVG(total_score)
FROM essayScores_bak AS essayScores
WHERE essayScores.nomination_sequence = nomination.nomination_sequence AND essayScores.nomination_year = nomination.nomination_year AND essayScores.total_score > "0"
)
WHERE nomination.nomination_year = "' . NOMINATION_YEAR . '" AND nomination.nomination_approved = "Y" AND nomination.nomination_locked = "N"
') or die('tallyScores(nominationTable): ' . mysql_error());
每个表的_-bak部分仅显示我在表的备份副本上对此进行了测试。你能解释一下这个答案和MGA的答案之间的区别吗?在hago上效果很好。谢谢投票将此作为答案是因为简单,而且它在我第一次通过时起作用。@ypercube感谢MGA,他的答案可能比我的更快。Mine可能多次执行对细节表的查询,他只使用了一次内部连接查询细节表,特别是当您有大量数据时,Mine的查询更简单易懂。您能解释一下这个答案和MGA的答案之间的区别吗?在@hago中非常有效。谢谢投票将此作为答案是因为简单,而且它在我第一次通过时起作用。@ypercube感谢MGA,他的答案可能比我的更快。Mine可能多次执行对细节表的查询,而他使用内部连接只查询一次细节表,尤其是当您有大量数据时,我的简单易懂,我试过了,但考虑到整个语法的复杂性和我知道有效的复杂的内部连接语法,我发现你的SQL语法有错误;查看与您的MySQL服务器版本对应的手册,以了解可使用的正确语法。所以我要试试黑格的版本,belowit看起来不错,可能有用。我就是不能让它为我工作。我投了另一个答案,因为事实上我马上就找到了答案。谢谢分享。@Dr.DOT,靠近什么??你能发布完整的错误吗?当然你可以试试hago的答案,我们希望你有一个有用的答案,不管是谁的答案。我不再有错误信息了,因为我删除了代码并使用了hago的解决方案。对于我来说,为我已经存在的SELECT语句定制的内容更少@MGA-我确实投了你一票,因为我相信你的答案也会起作用。我只是用另一个答案让我的脚本按照我需要的方式运行。我在这个问题的第三个答案中发布了我的最终和有效的查询语句。我尝试了这个方法,但考虑到整个语法的复杂性以及我知道有效的复杂的现有内部连接语法,我发现您的SQL语法中有一个错误;查看与您的MySQL服务器版本对应的手册,以了解可使用的正确语法。所以我要试试黑格的版本,belowit看起来不错,可能有用。我就是不能让它为我工作。我投了另一个答案,因为事实上我马上就找到了答案。谢谢分享。@Dr.DOT,靠近什么??你能发布完整的错误吗?当然你可以试试hago的答案,我们希望你有一个有用的答案,不管是谁的答案。我不再有错误信息了,因为我删除了代码并使用了hago的解决方案。对于我来说,为我已经存在的SELECT语句定制的内容更少@MGA-我确实投了你一票,因为我相信你的答案也会起作用。我刚刚用另一个答案按我需要的方式运行了我的脚本。我在这个问题的第三个答案中发布了我的最终和有效的查询语句。
// update all scored nominations "total score" and "average score" for current year where nomination approved and not locked
mysql_query('
UPDATE nomination_bak AS nomination
SET
nomination_score = (
SELECT SUM(total_score)
FROM essayScores_bak AS essayScores
WHERE essayScores.nomination_sequence = nomination.nomination_sequence AND essayScores.nomination_year = nomination.nomination_year
),
nomination_average = (
SELECT AVG(total_score)
FROM essayScores_bak AS essayScores
WHERE essayScores.nomination_sequence = nomination.nomination_sequence AND essayScores.nomination_year = nomination.nomination_year AND essayScores.total_score > "0"
)
WHERE nomination.nomination_year = "' . NOMINATION_YEAR . '" AND nomination.nomination_approved = "Y" AND nomination.nomination_locked = "N"
') or die('tallyScores(nominationTable): ' . mysql_error());