嘿伙计我仍然是MySQL的新手,我遇到了一个我似乎无法弄清楚的问题。
假设我有一个名为“tracks”的表,其中包含以下列和示例数据
track_hash | track_order
abc | 1
abc | 2
abc | 3
abc | 4
def | 1
def | 2
ghi | 1
所以关键是当我显示曲目时,曲目应按曲目顺序排序。因此,如果我想显示来自abc的所有曲目,它将根据曲目顺序(1,2,3)显示它。跟踪哈希“def”有两个轨道......等等。
所以目前在我的数据库中我只有一个空的track_order列。我将如何使用正确的数据填充track_order列?
答案 0 :(得分:1)
您可以使用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
之前初始化它们。
答案 1 :(得分:0)
我想你可能在寻找user defined variables。
你可以这样做:
SET @t1=0;
insert into `tablename` (track_order) values(@t1 := @t1+1) where id = some_id
我不完全确定如何为数据库中的每条记录执行此操作。我认为这应该有效,但这是按id
为基础进行的(如果情况更好的话,你可以track_hash
。不确定这是否适合你?
您必须以这种方式为每个track_hash
手动执行此操作,因此,如果您有许多不同的track_hash
记录,那么可能需要弄清楚如何为所有这些记录执行此操作他们一气呵成。但我不确定如何做到这一点。