2015-08-19 3 views
0

У меня вчера был вопрос, к сожалению, я недостаточно объяснил себя - один из них - конец дня.mySql подсчитывает все последние версии

Во всяком случае у меня есть таблица под названием документы ...

+----+--------------------------------------+-----------+---------+---------+ 
| id | document_guid      | title  | version | payload | 
+----+--------------------------------------+-----------+---------+---------+ 
| 1 | 0D2753BE-583B-42CE-B0DA-1FD0171D95C0 | animation | 1  | {}  | 
| 2 | 0D2753BE-583B-42CE-B0DA-1FD0171D95C0 | animation | 2  | {}  | 
| 3 | 1C2A1131-0261-4D58-81AA-EFAB5285B282 | formation | 1  | {}  | 
| 4 | 1E17403F-C590-4CE4-9E79-E1B7C98F97F1 | session | 1  | {}  | 
| 4 | 1E17403F-C590-4CE4-9E79-E1B7C98F97F1 | session | 2  | {}  | 
+----+--------------------------------------+-----------+---------+---------+ 

Как вы можете видеть, что мы можем иметь несколько версий одного и того же документа (на который ссылается document_guid). Мне нужно количество всех документов в таблице, исключая устаревшую версию. Если документ 1E17403F-C590-4CE4-9E79-E1B7C98F97F1 имеет две версии, как показано в примере выше, тогда он должен учитывать только один документ в общем счете.

Я действительно надеюсь, что это имеет больше смысла, чем мой последний вопрос.

Основная проблема, с которой я столкнулся, - мне нужен аналогичный запрос, который возвращает все последние версии, а не только счетчик.

+1

Как узнать, устарела ли версия? – KaeL

+0

Является ли «последняя версия» какой-либо другой, чем «только одна из каждой» здесь? – user2864740

ответ

2

полезный запрос, вероятно, выглядеть следующим образом:

-- select the maximum version (and other information, per group) 
-- can also add a 'count(1) as version_count' if required 
select max(version) as latest_version, title, document_guid 
from documents 
-- from each group, as divided up by the same guid *see note 1 
group by document_guid, title 

Этот запрос возвращает последний номер версии; всегда существует «одна последняя версия» для каждого документа.


Название, которое может быть перерывом в нормализации, должно быть частью группы для того, чтобы быть включены в столбцах результата; если не нужно, его можно удалить.

Если заголовок является обязательным полем, которое может изменить на разные версии, тогда это нужно написать по-другому - сначала найдите «последнюю версию», а затем соедините его с соответствующими строками. Пример:

select t.latest_version, d.title, d.document_guid 
from documents d 
join (
    select max(version) as latest_version, document_guid 
    from documents 
    group by document_guid 
) t 
on t.document_guid = d.document_guid and t.latest_version = d.version 

И это, конечно, предполагает ключ (document_guid, version).

2

Рассчитывать различные document_guids:

select count(distinct document_guid) from documents 

Чтобы вернуть последнюю версию каждого документа, вы можете либо сделать GROUP BY (как ответ user2864740 в), или NOT EXISTS:

select * from documents d1 
where not exists (select 1 from documents d2 
        where d2.document_guid = d1.document_guid 
        and d2.version > d1.version) 

Т.е. верните строку, если нет другого с тем же document_guid, который имеет более высокий номер версии.

+0

Это возвращает правильную сумму, хотя мне нужен аналогичный запрос, который возвращает всю последнюю версию, а не счет. –

+0

Хорошо, добавим это тоже через мгновение. – jarlh

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