【问题标题】:Problem selecting the latest record in JOIN在 JOIN 中选择最新记录的问题
【发布时间】:2010-07-09 15:50:45
【问题描述】:

这是我的两张桌子:

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 ;

一个文档可以有多个文件。我正在尝试SELECT files 表上带有JOIN 的所有文档,但我只想要 1 个文件记录,这是最新的。

这是我提出的查询,但不太有效,有人可以提出正确的方法吗?

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`

*edit:错误是'where子句'中的未知列'documents.Document_ID'

【问题讨论】:

  • 添加了一些格式...此外,您可能希望将“不太有效”更改为更有用的内容。

标签: sql mysql mysql-error-1054


【解决方案1】:

用途:

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 的最高记录...

【讨论】:

  • 你去吧,加糖和糖!
【解决方案2】:

不要按 file_id 分组,而是按 File_documentid。

【讨论】:

    【解决方案3】:

    我想我明白了……你有GROUP BY File_ID,但我猜你真的想要GROUP BY File_DocumentID

    【讨论】:

    • 谢谢,但我仍然在“where 子句”中收到未知列“documents.Document_ID”
    • @fire:那是因为您试图将其用作派生表/内联视图中的相关子查询 - 不起作用。
    猜你喜欢
    • 2013-02-04
    • 1970-01-01
    • 2019-03-02
    • 2021-05-16
    • 1970-01-01
    • 2019-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多