所有记录

时间:2015-10-23 09:37:40

标签: mysql

我无法将记录映射为我的期望。

文件表

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

问题:如何加入这两个表以获取具有最新版本doc信息的每个文档?即使我得到最新版本但行信息不正确。

到目前为止,我已尝试过此查询

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不正确。

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

简单,而不是

SELECT *, max(doc_version) AS latest_version

使用此

SELECT d_doc.*, max(doc_version) AS latest_version

选择*后你正在做的是在表格加入后获得所有结果,你只需要原始表格结果。

答案 2 :(得分: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

您得到错误的结果,因为您只选择了max(版本),但是因为它不在group by子句中的日期可以包含任何值。首先,您需要获取包含最新版本的记录,如上所示。

答案 3 :(得分:-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;

你可以尝试这样的事情。