基于另一列更新MySql列


Updating MySql Column based on another Column

我对MySQL还很陌生,刚刚遇到了一个似乎无法解决的问题。

假设我有一张名为";轨道";具有以下列和样本数据

track_hash | track_order 
abc        | 1
abc        | 2
abc        | 3
abc        | 4
def        | 1
def        | 2
ghi        | 1

关键是,当我显示轨迹时,轨迹应该按轨迹顺序排列。因此,如果我想显示abc中的所有曲目,它将根据曲目顺序(1,2,3)显示。Track hash";def";有两条轨道。。。等

所以目前在我的数据库中,我只有一个空的track_order列。如何使用正确的数据填充track_order列?

您可以使用update和用户定义的变量来执行此操作。然而,你有一个根本问题。SQL表表示无序的集合。因此,除非列指定了顺序,否则表中没有固有的顺序。

让我假设有一个名为id的列。然后以下操作可以满足您的要求:

update tracks t
    set t.track_order = if(@th = t.track_hash, (@rn := coalesce(@rn, 0) + 1),
                           if(@th := t.track_hash, @rn := 1, @rn := 1)
                          )
    order by t.track_hash, t.id;

您不必初始化变量就可以工作,但您可以在update之前初始化它们。

我认为您可能正在寻找用户定义的变量。

你可以这样做:

SET @t1=0; 
insert into `tablename` (track_order) values(@t1 := @t1+1) where id = some_id

我不完全确定你会如何对数据库中的每一条记录进行处理。我认为这应该有效,但这是在每个id的基础上实现的(如果更好的话,你可以将其设为track_hash)。不确定这是否适合你?

以这种方式,您必须为每个track_hash手动执行此操作,因此,如果您有许多不同的track_hash记录,则可能值得一次找出如何为所有这些记录执行此操作。但我不确定该怎么做。