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
)。
这里是 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
)。