Mysql 按条件更新相同 table 列并按列分组

Mysql update same table column by condition and group by column

这里是 Mysql table 我想将版本列设置为 below.there 版本列

需要更新数百万条记录
File_id |file_name |  type  | flag     | original_file_id  |  version

   1    |abc.jpg   | FILE   | RENAMED  |      1            |   1 
   3    |folder1   | FOLDER | RENAMED  |      3            |  null
   5    |folder1   | FOLDER | null     |      3            |  null
   7    |abc1.jpg  | FILE   | null     |      1            |   2 
   9    |abc1.jpg  | FILE   | DELETED  |      1            |   2 
   11   |abc.jpg   | FILE   | MOVED    |      1            |   3 
   13   |abc.jpg   | FILE   | null     |      1            |   4 
   15   |xyz.jpg   | FILE   | null     |      6            |   1 
   17   |xyz.jpg   | FILE   | DELETED  |      6            |   1 
   19   |xyz.jpg   | FILE   | null     |      6            |   2 

我想将版本设置为 above.For 第一个文件,其中 file_id=original_file_id 然后删除版本=1.if 标志然后将以前的版本设置为版本2.for other RENAMED,MOVED increment version.But 它应该只更新文件而不是文件夹。

您可以使用此查询:

UPDATE FILES
SET version = CASE
WHEN original_file_id = File_id THEN File_id
WHEN flag = 'DELETED' THEN (SELECT F1.version-F2.version FROM FILES F1, FILES t2 WHERE F1.File_id = F2.File_id -1)
WHEN flag = 'RENAMED' THEN ((SELECT F1.version-F2.version FROM FILES F1, FILES t2 WHERE F1.File_id = F2.File_id -1)+1)
WHEN flag = 'MOVED' THEN ((SELECT F1.version-F2.version FROM FILES F1, FILES t2 WHERE F1.File_id = F2.File_id -1)+1);

您可以使用以下查询:

update files
join 
( select f1.file_id, 
    count(f2.file_id) + count(distinct forg.file_id) as version
  from files f1
  left outer join files forg
  on f1.original_file_id = forg.file_id
    and f1.original_file_id = forg.original_file_id
    and forg.flag = 'DELETED'
  left outer join files f2
  on f1.original_file_id = f2.original_file_id
    and f1.file_id >= f2.file_id 
    and coalesce(f2.flag,'') <> 'DELETED'
    and coalesce(f2.type,'') <> 'FOLDER'
  where coalesce(f1.type,'') <> 'FOLDER'
  group by f1.file_id
) fileversions
on fileversions.file_id = files.file_id
set files.version = fileversions.version
where coalesce(files.type, '') <> 'FOLDER';

它将增加每个 original_file_id 组中的版本,除非它有一个 flag = 'Deleted'。所有包含 type = 'Folder' 的行都将被忽略且不会更新。

第一个 file_id = original_file_id 的文件将获得版本 1,即使它具有 flag = 'deleted',在这种情况下,下一个未删除的文件将获得版本 2。

查询不会检查您的数据是否已损坏,例如如果带有 file_id = original_file_id 的文件存在,或者如果存在 ID 带有 file_id < original_file_id.

的文件

如果您希望它在合理的时间内完成,您需要索引 original_file_id(或 original_file_id, file_id)。