2016-09-17 3 views
-2

Вот Mysql таблицы Я хочу, чтобы установить версию колонки, как below.there миллионы записей должны быть обновлены для версии колонки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 

Я хочу установить версия, как указано выше. Для 1-го файла, где file_id = original_file_id, тогда флаг версии = 1.if DELETED, а затем установите предыдущую версию, такую ​​как версия 2. для другой версии RENAMED, MOVED increment. Но она должна обновляться только для файлов, не предназначенных для папки.

+0

Каков основной столбец в вашей таблице? –

+0

@JimMacaulay жаль, что я обновил свой вопрос file_id - это первичный ключ – techsavvy

+0

@GordonLinoff Нет, ревизия зависит от флага и original_file_id. И версия не такая же, как original_file_id, сейчас. – techsavvy

ответ

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 существует или есть файлы с идентификатором file_id < original_file_id.

Для того, чтобы завершить его в разумные сроки, необходим индекс original_file_id (или original_file_id, file_id).

+0

Спасибо за помощь. Но у меня есть некоторые сомнения. 1) (Если в первом файле группы есть этот флаг, его версия установлена ​​0), этого не следует ожидать, потому что сначала файл всегда получает версию 1 не что иное. 2) если некоторая оригинальная запись файла повреждена, то как она может справиться? как originalfileid 50, и эта группа имеет 3 файла с файлом 51,52,53, а исходный идентификатор файла - 50, а файл с оригинальным файлом и fileid 50 поврежден. – techsavvy

+0

1) что должно произойти, если первая запись удалена?Вы сказали, что «удаленный» файл должен получить «version before», который не существует 2) Я не понимаю, что вы подразумеваете под этим, можете ли вы привести пример и результат, который вы хотели бы получить? Но в целом: если ваши данные не чисты, вы не можете ожидать чистого результата. Вы имеете в виду нечто вроде 'original_file_id = 6'? Даже если 'file_id = 6' не существует, мой запрос даст вам точно результат в вашем вопросе для этого случая (версия 1 для' file_id = 15'). – Solarflare

+0

забудьте о 2-ом состоянии поврежденных данных. Но должно быть 1 условие, которое есть файлы, у которых есть fileid = originalfileid, у которых есть версия всегда 1. Например, в моем примере файлы таблицы с файлом id 1 и 15 являются 1-м файлом с исходным файлом id всегда 1 независимо от флага. Для чего нужно после этого рассмотреть флаг. – techsavvy

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

надеюсь, что вы его получили. Любые проблемы, не стесняйтесь спрашивать.

+0

спасибо, я попробую это. – techsavvy

+0

Вы поняли? –

+0

Я получаю это, но я обновил свой вопрос снова, изменив столбцы столбцов добавленных столбцов, пожалуйста, проверьте это сейчас. Мне нужно обновлять только файлы, не относящиеся к папкам. Поэтому для file_id его не всегда увеличивается на 1. – techsavvy

 Смежные вопросы

  • Нет связанных вопросов^_^