我是SQL新手。我搜索了一个符合我要求的答案,我会理解已经做了什么 - 我失败了。所以这里:
我正在制作一个能够保存马拉松锦标赛数据的程序。所以我有一个表格StageResults
,其中包含以下列:StageNo
ParticipantNumber
ParticipantGroup
Time
(如在完整秒的距离时间中因此为int)和Points
一个例子如下:
- 1|01|M21|500|X
- 1|22|M21|550|X
- 1|45|M21|530|X
- 1|47|F09|600|X
- 1|09|F09|630|X
- 2|01|M21|515|X
- 2|45|M21|520|X
所以我希望每个阶段中每个小组中最快的成员获得1000分。在我的脑后,我觉得,我可以为此写一个单一的查询,我试了好几个小时。 我现在最好的是:
SELECT c1.ParticipantNumber, c1.ParticipantGroup, c1.Time
FROM StageResults AS c1
LEFT JOIN StageResults AS c2
ON c1.StageNo = c2.StageNo
AND c1.ParticipantGroup = c2.ParticipantGroup
AND c1.Time < c2.Time;
我在INSERT语句下使用了它。没有语法错误但错误,我试图插入一个重复的主键。我认为这可以通过添加GROUP BY语句来解决。所以我还没有真正测试过这个。
我最终希望在每次运行(阶段)和每个组中为最快参与者设置1000个点(我的意思是它应该自动发生)。然后基于最快的人,为所有其他人计算积分。(但那是后来如果我想出如何添加这些1k点,我认为生病管理) 所以我必须在UPDATE语句中添加这个逻辑。我无法做到。我只是输了。
欢迎任何建议。也许我正在思考如何做到这一点的错误方向。 任何帮助将不胜感激。
答案 0 :(得分:1)
标识行的查询可能如下所示:
select t.*
from table t
where not exists (select 1
from table t2
where t2.ParticipantGroup = t.ParticipantGroup and
t2.StageNo = t.StageNo and
t2.time < t.time
);
问题是如何将其转变为更新。对于MySQL,您可以这样做:
update table StageResults sr join
(select t.*
from table t
where not exists (select 1
from table t2
where t2.ParticipantGroup = t.ParticipantGroup and
t2.StageNo = t.StageNo and
t2.time < t.time
)
) toupdate
on toupdate.ParticpantNumber = sr.ParticpantNumber
set sr.points = sr.points + 1000;
SQL Server的语法会有所不同,但您的问题标记为MySQL。
编辑:
对于SQL Server:
with toupdate as (select t.*
from table t
where not exists (select 1
from table t2
where t2.ParticipantGroup = t.ParticipantGroup and
t2.StageNo = t.StageNo and
t2.time < t.time
)
)
update toupdate
set points = points + 1000;