更新表对具有重复值的所有行设置相同的值

时间:2019-07-06 10:37:14

标签: mysql

我有一张运动成绩表。使用以下代码时,表格会根据时间获得位置。

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

1 个答案:

答案 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     |