【问题标题】:Updating MySql Column based on another Column基于另一个列更新 MySql 列
【发布时间】:2015-05-02 07:24:36
【问题描述】:

我对 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 列?

【问题讨论】:

  • 所以你希望每个哈希有一个从 1 到 N 的连续 track_order?没有明显的理由订购它们,也没有标准
  • 你的意思是通过php还是仅仅通过mysql?您是在寻找一次性的东西,还是一直想要跟踪订单?
  • @Bono 仅通过 mysql 进行。我已经建立了一个包含许多不同轨道信息的数据库。一些轨道被散列在一起,稍后我将找出改变轨道顺序值的 php 代码。我只需要先设置跟踪顺序列
  • @amenadiel 抱歉,我意识到我应该在我的示例中添加更多内容。我的曲目表有很多其他信息,例如曲目名称...曲目音频...曲目艺术家...等。当它显示到网页上时,我希望用户能够重新排列曲目的显示顺序。这就是我想添加跟踪顺序列的原因
  • 现在轨道顺序是否重要,或者每个 track_hash 的增量现在是否足够?

标签: php mysql sql web


【解决方案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 之前初始化它们。

【讨论】:

  • 这个问题是你永远不会将“@th”设置为更新后的 track_hash...这只会用 1 填满我的整个表
  • @DavidYuan 。 . . if 的第二个子句设置 @th。在第一次迭代中,第一个 if() 将失败,然后将其设置为正确的值。
  • 我刚试过这个,它把我的整列设置为 1。据我了解...第一次迭代将转到第二个 if 语句,但第二个 if 语句只会设置 @rn = 1?
  • 等一下,对不起,我打错了。这完美地工作。太感谢了!我误读了第二个中的 := 运算符,如果只是 =
【解决方案2】:

我想你可能正在寻找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 记录,那么可能值得弄清楚如何一次性为所有这些记录执行此操作。但我不确定该怎么做。

【讨论】:

  • 我在为每个 track_hash 找出一种方法时遇到了同样的问题。您的方法解决了能够同时更新一个完整 track_hash 的问题,但目前我的数据库中有大约 8000 多个不同的 track_hash :(
  • 没关系!感谢您的帮助!
  • 快速提问;你有一个 id 列吗?如果都是增量 id,你也可以这样做。
  • 是的,我愿意。同样,我的问题不是递增。事实上,我每次都必须重置我的变量是一个新的 track_hash。我明白我必须做什么,只是我对 sql 语法很不熟悉
猜你喜欢
  • 2013-09-05
  • 1970-01-01
  • 1970-01-01
  • 2015-11-18
  • 1970-01-01
  • 2021-04-15
  • 1970-01-01
  • 2021-07-14
相关资源
最近更新 更多