Mysql按条件和逐列更新相同的表列

时间:2016-09-17 16:48:54

标签: mysql sql stored-functions

这是我要设置版本列的Mysql表,如下所示。版本列需要更新数百万条记录

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 

我想设置如上所述的版本。对于第一个文件,其中file_id = original_file_id然后版本= 1.if标志是DELETED然后设置先前版本,如版本2.对于其他RENAMED,MOVED增量版本。但它应该只更新对于不是文件夹的文件。

2 个答案:

答案 0 :(得分:0)


您可以使用此查询

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);

希望你明白了。任何问题,请随时询问。

答案 1 :(得分:0)

您可以使用以下查询:

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)。