如何在数据库中有效地重新排列行值排序?

时间:2018-03-09 14:56:25

标签: mysql sql

不确定包含背景的内容 - 使用带有InnoDB的MySQL / MariaDB并与python混合使用。

我有一些非常庞大的表格,除此之外,它们有3个数字列,让我们说A,B& C.是否有一种有效的方法来更新每一行,使A,B和C中的数字增加(或减少)顺序?

E.g。截至目前:

+----+------------+-----+-----+-----+
| ID | Other data |  A  |  B  |  C  |
+----+------------+-----+-----+-----+
|  1 | Something  | 2.0 | 1.3 | 1.0 |
|  2 | Something  | 1.0 | 3.0 | 2.0 |
|  3 | Something  | 1.0 | 3.0 | 1.0 |
+----+------------+-----+-----+-----+

希望如此:

+----+------------+-----+-----+-----+
| ID | Other data |  A  |  B  |  C  |
+----+------------+-----+-----+-----+
|  1 | Something  | 1.0 | 1.3 | 2.0 |
|  2 | Something  | 1.0 | 2.0 | 3.0 |
|  3 | Something  | 1.0 | 1.0 | 3.0 |
+----+------------+-----+-----+-----+

1 个答案:

答案 0 :(得分:0)

有效的解决方案?您需要对所有行执行update,这样效率不高。

如果您只有三列,那么如果值完全不同,则可以使用简单的case逻辑:

select id, . . .,
       least(a, b, c) as a,
       (case when a not in (least(a, b, c), greatest(a, b, c)) then a
             when b not in (least(a, b, c), greatest(a, b, c)) then b
             else c
        end) as b, 
       greatest(a, b, c) as b
from t;

如果您有重复项或NULL值,逻辑会变得复杂一些,但可以调整类似的东西。如果你有超过3列,它会变得更加麻烦。

这很容易适应更新。如果你真的想将它们存储在一个表中,我会使用create table as将它们放在另一个表中。 Insert的速度比update的大量{。}}快。