我对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
记录,则可能值得一次找出如何为所有这些记录执行此操作。但我不确定该怎么做。