从两个表和最新条目中选择

时间:2013-03-21 23:44:42

标签: mysql sql greatest-n-per-group

我在从MySQL调用并获得我需要的东西时继续遇到问题。我有两个名为项目和条目的表,我想要做的是获取最新的时间戳条目。 SQL查询如下:

SELECT 
    projects.ProjectLogo, projects.ProjectLink, projects.ProjectDescription, 
    entries.EntryNum, entries.Votes, entries.Views, entries.Update 
FROM 
    projects 
    LEFT JOIN entries 
        ON projects.ProjectID = entries.ProjectID 
        AND projects.Media = 'image' 
        AND projects.Type = 'fan-art' 
GROUP BY 
    projects.ProjectID 
ORDER BY 
    entries.Update DESC

问题是我得到了结果但没有得到最新的条目,我使用了MAX(entries.Update),但它不起作用。有什么建议?为什么不起作用?

3 个答案:

答案 0 :(得分:0)

您可以使用子查询为表Update上的每个ProjectID获取最新的entries。然后子查询的结果将连接回两个连接语句,提示它将匹配两列:ProjectIDUpdate

SELECT  projects.ProjectLogo, 
        projects.ProjectLink, 
        projects.ProjectDescription, 
        entries.EntryNum, 
        entries.Votes, 
        entries.Views, 
        entries.Update 
FROM    projects 
        INNER JOIN entries 
            ON  projects.ProjectID = entries.ProjectID 
        INNER JOIN  
        (
            SELECT  a.ProjectID, MAX(a.Update) max_val
            FROM    entries a
            GROUP   BY a.ProjectID
        ) b ON  b.ProjectID = entries.ProjectID AND
                b.max_val = entries.Update
WHERE   projects.Media = 'image' AND 
        projects.Type = 'fan-art' 
ORDER   BY entries.Update DESC

答案 1 :(得分:0)

您必须将连接限制为仅包含最新输入日期的记录(行)。 如果条目中的pk按时间顺序增加,则可以使用它。

Select p.ProjectLogo, p.ProjectLink, p.ProjectDescription, 
      e.EntryNum, e.Votes, e.Views, e.Update 
From projects p 
   Left Join entries e 
     On e.EntryId =
        (Select(Max(entryId) from entries
         where ProjectID = p.ProjectID)
Where p.Media = 'image' 
    And p.Type = 'fan-art' 
Group By p.ProjectID 
Order By e.Update Desc

否则,您需要一个双嵌套子查询

Select p.ProjectLogo, p.ProjectLink, p.ProjectDescription, 
      e.EntryNum, e.Votes, e.Views, e.Update 
From projects p 
   Left Join entries e 
     On e.EntryId =
        (Select entryId from entries
         where ProjectID = p.ProjectID
            And update =
                (Select max(update) From entries
                 Where ProjectID = p.ProjectID))                        
where p.Media = 'image' 
    And p.Type = 'fan-art' 
Group By p.ProjectID 
Order By e.Update Desc

答案 2 :(得分:0)

尝试使用子查询获取最新条目:

select projectId, max(`update`) as lastUpdate
from entries
group by projectId

现在,使用此子查询来获取所需内容:

select ...
from 
    projects as p
    inner join entries as e on p.projectId=e.projectId
    inner join (
        select projectId, max(`update`) as lastUpdate
        from entries
        group by projectId) as me on e.`update`=me.lastUpdate

希望这有助于你