2015-10-23 79 views
1

我無法將記錄映射爲我的預期。Mysql加入select max for all記錄

文件表

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

文件的詳細信息表

-----------+--------------+----------------------- 
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 

你得到錯誤的結果,因爲你只選擇了最大值(版本),但日期是不是在GROUP BY子句可以包含任意值。首先,您需要獲取包含最新版本的記錄,如上所示。

+0

感謝您的解決方案〜我做到了!我也發現這篇文章是非常有用和很好的解釋。 HTTP://www.xaprb。COM /博客/ 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

這段代碼可能是一個很好的解決方案,但是沒有解釋它並不是真的有用。你能解釋一下爲什麼這個代碼有幫助嗎?請閱讀[幫助]中的[回答]瞭解更多信息。 – Pred

0

方便,而不是

SELECT *, max(doc_version) AS latest_version 

使用此

SELECT d_doc.*, max(doc_version) AS latest_version 

什麼,你被選擇*是讓所有的結果表被加入,你只是想原件後做表結果。

+0

謝謝你的解答,謝謝你的解答,但它對我不起作用。我已經更新了我的問題,以便更好地理解〜 –

-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 for late reply〜謝謝你的解答。但我不明白你的查詢,你可以基於我的表字段? sry about –

+0

內部選擇查詢會爲您提供文檔的版本表中的最新版本,稍後您可以在第一個查詢中通過doc id創建一個組,並獲得結果。這不可能是您期望的確切查詢,但您可以從中得到一個想法。 –

+0

謝謝,我會試試看〜 –