这是我要设置版本列的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增量版本。但它应该只更新对于不是文件夹的文件。
答案 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
)。