更新字段以增加直到另一个字段更改

D H*_*son 5 mysql sql sql-update

这是我的第一个堆栈溢出问题,如果我做错了,请道歉.我避免在问题中使用术语"索引",以免混淆我的问题与数据库索引.这个问题是关于索引表示法 - 指定一系列项目中元素的位置.


摘要

我有一个documents与其对应存储的系统paragraphs; 每个都document包含很多paragraphs.该数据存储在MySQL数据库中.

paragraphs表包含以下字段:

  • 主键(AUTO INCREMENT)
  • 文档ID(文档表的外键)

我希望在paragraphs设置为给定段落的索引的表中添加一个新字段,该字段与其所在的文档相关.此查询仅在添加此字段的迁移期间运行一次; 然后我计划在插入段落时填充它.

每个文档中的第一段应该有index = 0.每个文档中的第二段应该有index = 1.

段落表

主键:1文档ID:1索引:0

主键:2文档ID:1索引:1

主键:3文档ID:1索引:2

主键:4文档ID:2索引:0

主键:5文档ID:2索引:1

一个显而易见的方法是在每个文档的基础上执行此操作,但这在大型文档数据库中似乎效率低下.

非常感谢您的帮助!大教堂

Gor*_*off 4

您可以使用变量来执行此操作(当然,在添加列之后):

alter table paragraphs add index int;

set @d := 0;
set @i := 0;

update paragraphs
    set index = (if(@d = document_id, @i := @i + 1,
                    if(@d := document_id, @i := 1, @i := 1)
                   )
                ) - 1  -- to start numbering at 0 rather than 1
    order by document_id, primary_key;
Run Code Online (Sandbox Code Playgroud)

注意: index对于列来说这是一个非常糟糕的名称,因为它是一个 SQL 关键字。将该列命名为其他名称,例如paragraph_number