【发布时间】:2013-10-14 00:38:43
【问题描述】:
我有 2 张桌子,SVISE 和 OVERW
在 OVERW 里面,我有一些带有人员 ID 和得分日期的分数。
例如
p_id degrees mo_date
5 10.2 2013-10-09
5 9.85 2013-03-10
8 14.75 2013-04-25
8 11.00 2013-02-22
5 5.45 2013-08-11
5 6.2 2013-06-10
SVISE.ofh 字段必须更新为最后三个记录的总和
(对于特定的人,按日期降序排列),因此对于 id 为 5 的人,总和将来自行
5 10.2 2013-10-09
5 5.45 2013-08-11
5 6.2 2013-06-10
sum=21.85.
希望的最终结果在 SVISE 上,基于上述值:
HID OFH START
5 21.85 October, 16 2013 ##(10.2 + 5.45 + 6.2)
5 21.5 September, 07 2013 ##(5.45 + 6.2 + 9.85)
5 0 March, 05 2013 ##(no rows)
8 25.75 October, 14 2013 ##(14.75 + 11)
3 0 October, 14 2013 ##(no rows)
5 0 March, 05 2012 ##(no rows)
OFH最初为 0
我可以获得特定人的总和,但我不能使用 limit 来获取最后 3 行。它会被忽略。
这是我用来检索给定日期每人所有学位的总和的查询:
UPDATE SVISE SV
SET
SV.ofh=(SELECT sum(degrees) FROM OVERW WHERE p_id =SV.hid
AND date(mo_date)<date(SV.start)
AND year(mo_date)=year(SV.start))
我不能只对 sum 使用 limit:
UPDATE SVISE SV
SET
SV.ofh=(SELECT sum(degrees) FROM OVERW WHERE p_id =SV.hid
AND date(mo_date)<date(SV.start)
AND year(mo_date)=year(SV.start)
ORDER BY mo_date DESC
LIMIT 3)
这不起作用。
我已经尝试使用multi-table updates 和nested queries 来实现这一点。
每个场景都有已知的限制,阻碍我完成预期的结果。
- 嵌套查询无法查看父表。
Unknown column 'SV.hid'in 'where clause' - 多表更新不能与限制一起使用。
Incorrect usage of UPDATE and LIMIT
任何解决方案都可以。无需在单个查询中执行此操作。如果有人想尝试使用中间表。
SQL fiddle 也可用。
提前感谢您的帮助。
--更新--
这是来自 Akash 的解决方案:http://sqlfiddle.com/#!2/4cf1a/1
【问题讨论】:
-
在您的查询中,您正在验证年份是否匹配。这是要求的一部分吗?此外,哪些列或哪些列构成
SVISE(或svice,根据SQL Fiddle)的主键? -
@AndriyM,我想要一个人的“最后”3 度,唯一的过滤器是日期。从现在起最后 3 度或从昨天起最后 3 度等。
-
这个数据集是否与sqlfiddle中提供的对应?如果没有,请考虑为该 sqlfiddle 数据集提供正确的结果集,并相应地更新您的问题。只为 overw 表提供完整的结果集是明智的。
-
另外,你确定这些应该是 FLOAT 而不是 DECIMAL?
-
嗨草莓,是的,它是相同的数据集,我将小数更改为浮点数只是为了让人们更容易从视觉上理解它,以及一些随机数据。小提琴结构是一样的,你可以改变它,插入你喜欢的任何行,甚至让它包含与问题相同的行。
标签: mysql sql-update