2016-07-08 80 views
0

我一直试图从数据库中获取一些数据,但当我只需要为每个文件类型获取最新的文件上载时就卡住了。在使用WHERE子句之前,我已经完成了这一步,但是这次需要一个额外的表来确定文件类型。SQL - 只选择WHERE子句的最新记录

我的查询看起来像这样到目前为止,我得到这个用户的六个记录(2x filetypeNo4和4x filetypeNo2)。

SELECT db_file.fileID 
    ,db_profile.NAME 
    ,db_applicationFileType.fileTypeID 
    ,> db_file.dateCreated 
FROM db_file 
LEFT JOIN db_applicationFiles 
    ON db_file.fileID = db_applicationFiles.fileID 
LEFT JOIN db_profile 
    ON db_applicationFiles.profileID = db_profile.profileID 
LEFT JOIN db_applicationFileType 
    ON db_applicationFiles.fileTypeID = > > db_applicationFileType.fileTypeID 
WHERE db_profile.profileID IN ('19456') 
    AND db_applicationFileType.fileTypeID IN ('2','4') 

我在WHERE子句这样看这是不工作:

(db_file.dateCreated IS NULL 
OR db_file.dateCreated = (
    SELECT MAX(db_file.dateCreated) 
    FROM db_file left join 
db_applicationFiles on db_file.fileID = db_applicationFiles.fileID 
    WHERE db_applicationFileType.fileTypeID = db_applicationFiles.FiletypeID 
)) 

对不起我是一个小白所以这可能是很简单,但我刚学这个东西,我去我的自己..

+1

请提供样本数据和预期的结果.. –

+2

不直接关系到你的问题,但'留下了一个'WHERE db_applicationFileType.fileTypeID = db_applicationFiles.FiletypeID'将加入db_applicationFiles'将此表视为“内连接”。不知道这是你想要的。 – ughai

回答

0
SELECT 
    ff.fileID, 
    pf.NAME, 
    ff.fileTypeID, 
    ff.dateCreated 
FROM db_profile pf 
OUTER APPLY 
(
    SELECT TOP 1 af.fileTypeID, df.dateCreated, df.fileID 
    FROM db_file df 
    INNER JOIN db_applicationFiles af 
    ON df.fileID = af.fileID 
    WHERE af.profileID = pf.profileID 
    AND af.fileTypeID IN ('2','4') 
    ORDER BY create_date DESC 
) ff 
WHERE pf.profileID IN ('19456') 

而且它看起来像所有的加入实际上是INNER。除非有没有文件的配置文件(这就是为什么OUTER而不是CROSS)。

0

什么明显的:

SELECT * FROM 
    (SELECT * FROM db_file ORDER BY dateCreated DESC) AS files1 
GROUP BY fileTypeID ; 
+0

这段代码实际上并不是很明显。不知道这是否会发生100%,但是优化器可能会完全忽略_subquery_中的'order by'而没有_top_。 –