2010-07-09 26 views
1

這是我的2個表:選擇問題的最新記錄在JOIN

CREATE TABLE `documents` (
    `Document_ID` int(10) NOT NULL auto_increment, 
    `Document_FolderID` int(10) NOT NULL, 
    `Document_Name` varchar(150) NOT NULL, 
    PRIMARY KEY (`Document_ID`), 
    KEY `Document_FolderID` (`Document_FolderID`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=331 ; 


CREATE TABLE `files` (
    `File_ID` int(10) NOT NULL auto_increment, 
    `File_DocumentID` int(10) NOT NULL, 
    `File_Name` varchar(255) NOT NULL, 
    PRIMARY KEY (`File_ID`), 
    KEY `File_DocumentID` (`File_DocumentID`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=333 ; 

可以有多個文件,以1號文件。我正在嘗試SELECTfiles表上的JOIN的所有文檔,但我只想要最新的一個文件記錄。

這裏是我的問題,我想出了,不太工作,任何人都可以提出正確的方法嗎?

SELECT `documents`.* 
    FROM `documents` 
     INNER JOIN (
     SELECT MAX(`File_ID`), * 
     FROM `files` 
     WHERE `File_DocumentID` = `documents`.`Document_ID` 
     GROUP BY `File_ID`) AS `file1` 
     ON `documents`.`Document_ID` = `file1`.`File_DocumentID` 
    WHERE `documents`.`Document_FolderID` = 94 
    ORDER BY `documents`.`Document_Name` 

*編輯:錯誤是未知列 'documents.Document_ID' 在 'where子句'

+0

添加了一些格式...此外,您可能想要更改「不太有效」到更有用的東西。 – Amadan 2010-07-09 15:55:08

回答

3

用途:

SELECT d.*, f.* 
    FROM DOCUMENTS d 
    JOIN FILES f ON f.file_document_id = d.document_id 
    JOIN (SELECT t.file_document_id, 
       MAX(t.file_id) AS max_file_id 
      FROM FILES t 
     GROUP BY t.file_document_id) x ON x.file_document_id = f.file_document_id 
            AND x.max_file_id = f.file_id 

名爲「X」的派生表/聯視圖是一個連接到同一個表,它的作用是調整從FILES表來爲每file_document_id最高記錄。 ..

+0

真棒謝謝! – fire 2010-07-09 16:12:01

+0

你去了,有糖衣和糖! – fire 2010-07-09 16:24:30

+0

@fire:謝謝:) – 2010-07-09 16:25:28

0

不要GROUP BY file_id的,而是由File_documentid。

0

我想我明白了什麼是錯的...你有GROUP BY File_ID,但我想你真的想要GROUP BY File_DocumentID來代替。

+0

謝謝,但我仍然在'where子句'中獲取Unknown列'documents.Document_ID' – fire 2010-07-09 16:01:01

+0

@fire:這是因爲您試圖將其用作派生表/內聯視圖中的相關子查詢 - 不起作用。 – 2010-07-09 16:03:32