2015-10-23 7 views
1

Я не могу сопоставить запись как мое ожидание.Mysql join select max для всех записей

Doc Таблица

-------+------------------- 
doc_id | doc_title   
-------+------------------- 
1  | My book 
-------+------------------- 
2  | My sec Book 
-------------------------- 

детали Doc Таблица

-----------+--------------+----------------------- 
fk_doc_id | doc_version | submit_date 
-----------+--------------+----------------------- 
1   | 1   | 2015-10-25 14:32:01 
-----------+--------------+----------------------- 
1   | 2   | 2015-10-26 13:00:01 
-----------+--------------+----------------------- 
1   | 3   | 2015-10-27 09:00:00 
--------------------------+----------------------- 
2   | 1   | 2015-10-25 11:15:01 
-----------+--------------+----------------------- 
2   | 2   | 2015-10-26 10:00:00 
--------------------------+----------------------- 

Вопрос: Как я могу вступить в эти две таблицы, чтобы получить каждый документов с последней информацией версии док? даже если я получаю последнюю версию, но информацию о строке, которая неверна.

До сих пор я пытался этот запрос,

SELECT *, max(doc_version) AS latest_version 
FROM d_doc 
JOIN d_doc_dtl ON d_doc.doc_id = d_doc_dtl.fk_doc_id 
GROUP BY d_doc.doc_id; 

Мой ожидаемый результат

--------+--------------+----------------+-------------------- 
doc_id | doc_title | latest_version | submit_date 
--------+--------------+----------------+-------------------- 
1  | My book  | 3    | 2015-10-27 09:00:00 
--------+--------------+----------------+-------------------- 
2  | My sec book | 2    | 2015-10-26 10:00:00 
----------------------------------------+-------------------- 

, но мой результат

--------+--------------+----------------+-------------------- 
 
doc_id | doc_title | latest_version | submit_date 
 
--------+--------------+----------------+-------------------- 
 
1  | My book  | 3    | 2015-10-25 14:32:01 
 
--------+--------------+----------------+-------------------- 
 
2  | My sec book | 2    | 2015-10-25 11:15:01 
 
----------------------------------------+--------------------

ПРИМЕЧАНИЕ: submit_date не является правильным.

+0

Не работает ли этот запрос так, как вы ожидаете? Если да, то какой результат сейчас? – rMX

ответ

0

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

SELECT d.doc_id, 
     d.doc_title, 
     dtl.doc_version latest_version, 
     dtl.submit_date 
    FROM d_doc d 
INNER JOIN (SELECT dt.* 
       FROM d_doc_dtl dt 
       INNER JOIN (SELECT fk_doc_id, MAX(doc_version) doc_version 
          FROM d_doc_dtl 
          GROUP BY fk_doc_id) dm 
       ON dt.fk_doc_id = dm.fk_doc_id 
       AND dt.doc_version = dm.doc_version) dtl 
    ON d.doc_id = dtl.fk_doc_id 

Вы получаете неправильные результаты, потому что вы выбрали только макс (версии), но дату, как это не в группе по статье может содержать любое значение. Сначала вам нужно получить записи, содержащие последнюю версию, как показано выше.

+0

Спасибо за решение ~ я это сделаю !! также я нашел, что эта статья очень полезна и объясняет хорошо. Http: //www.xaprb.ком/блог/2006/12/07/как к выбрать-заместитель firstleastmax-рядного погруппной-в-SQL / –

1
SELECT d_doc.doc_id, d_doc.doc_title, max_table.latest_version 
FROM d_doc JOIN (
select fk_doc_id, max(doc_version) as latest_version from d_doc_dtl group by fk_doc_id 
) as max_table ON d_doc.doc_id = max_table.fk_doc_id 
+0

Возможно, этот код является хорошим решением, однако без объяснений это не очень полезно. Не могли бы вы объяснить, почему и как этот код помогает? Пожалуйста, прочитайте [ответ] в [help] для получения дополнительной информации. – Pred

0

Easy, вместо

SELECT *, max(doc_version) AS latest_version 

Используйте этот

SELECT d_doc.*, max(doc_version) AS latest_version 

Что вы делаете, выбирая * получает все результаты после того, как таблица соединяется и вы хотите только оригинал результаты таблицы.

+0

sry для позднего ответа ~ спасибо за решение, но он не работает для меня. я обновил свой вопрос для лучшего понимания. ~ –

-1
select * from doc_table , doc_version where exists(select 
     max(version_id) 
    from 
     doc_version vert 
    where 
     (doc_table .DOC_ID = vert.VERSION_DOC_ID)) group by doc_id; 

Вы можете попробовать что-то вроде этого.

+0

sry для позднего ответа ~ спасибо за решение. но я не понимаю вас, вы можете основываться на моем поле таблицы? sry about this –

+0

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

+0

Спасибо, я попробую ~ –