我有一张运动成绩表。使用以下代码时,表格会根据时间获得位置。
SET @pos := 0;
UPDATE table SET Place = ( SELECT @pos := @pos + 1 ) ORDER BY Time ASC;
在相同时间的情况下(例如行1,3和4,5),它会根据ID-s更新它,因此结果如下:
ID | Time | Place
1 | 00:12:14 | 1
2 | 00:12:18 | 3
3 | 00:12:14 | 2
4 | 00:12:25 | 4
5 | 00:12:25 | 5
如何更新表,以便如果同时有多行,所有行都将排在最佳位置(如下表所示)?
ID | Time | Place
1 | 00:12:14 | 1
2 | 00:12:18 | 3
3 | 00:12:14 | 1
4 | 00:12:25 | 4
5 | 00:12:25 | 4
答案 0 :(得分:1)
您可以通过将表连接到查询来完成此操作,每行返回的行数少于其时间:
update tablename t inner join (
select t.id, (
select count(*) counter from tablename
where time < t.time
) counter
from tablename t
) c on c.id = t.id
set t.place = c.counter + 1;
请参见demo。
结果:
| ID | Time | Place |
| --- | -------- | ----- |
| 1 | 00:12:14 | 1 |
| 2 | 00:12:18 | 3 |
| 3 | 00:12:14 | 1 |
| 4 | 00:12:25 | 4 |
| 5 | 00:12:25 | 4 |