我正在努力修复我们的(论坛)数据库,因为似乎某些帖子中的几个帖子都显示了相同的帖子号码(#2)。看起来他们都在每个论坛帖子中都占有“1”的位置。
我设法找到一个查询,通过以下查询将这些位置值设置为正确的数字:
select @i := -1; update `xf_post` set position = (select @i := @i + 1) where thread_id=1;
不幸的是,我只是通过MySQL命令行进行此更新查询,我不断选择向上箭头键,将'thread_id'值递增1,然后点击Return键。有没有更快的方法通过循环或游标执行此操作?我对SQL语法的其他部分不是很熟悉,而且我只熟悉基础知识。
答案 0 :(得分:0)
您可以使用以下查询来获取每个线程所需的数字:
select thread_id,
(case when @prev = thread_id then @rn := 1 else @rn := @rn + 1 end) as rn,
@prev = @threadid
from xf_post p cross join
(select @rn := 0, @thread_id = -1) const
order by thread_id, position
您可以测试它以确保它产生正确的值。接下来,您可以使用update
join
update xf_post join
(select thread_id, post_id,
(case when @prev = thread_id then @rn := 1 else @rn := @rn + 1 end) as rn,
@prev = @threadid
from xf_post p cross join
(select @rn := 0, @thread_id = -1) const
order by thread_id, post_id
) toupdate
on xf_post.post_id = toupdate.post_id
set xf_post.position = toupdate.rn;