2012-08-08 29 views
2

我有两个表左连接到最近的战绩

游戏和成绩:

游戏都有一个主键ID

成绩已经game_id它引用games.id等领域中产生的。

我在尝试修改第question号公认的答案中的第二个例子以适合我的需要。

SELECT g.*, 
     s.* 
    FROM GAMES g 
    LEFT JOIN SCORES s ON s.game_id = g.id 
    JOIN (SELECT n.game_id, 
       MAX(n.created_on) AS max_score_date 
      FROM SCORES n 
     GROUP BY n.game_id) y ON y.game_id = s.game_id 
          AND y.max_score_date = s.created_on 

它几乎可以工作,它获得每个游戏得分表中最近的条目。但它只返回在分数表中有相应条目的游戏。我需要它返回表中所有的比赛,如果他们在比分表中有条目的话。通过阅读前面提到的问题,我假定左连接将完成。

回答

3
SELECT 
    g.*, s.* 
FROM 
    GAMES g 
LEFT JOIN 
(
    SCORES s 
    INNER JOIN 
    (
    SELECT 
     n.game_id, MAX(n.created_on) AS max_score_date 
    FROM 
     SCORES n 
    GROUP BY 
     n.game_id 
) 
    y 
     ON y.game_id  = s.game_id 
     AND y.max_score_date = s.created_on 
) 
    ON s.game_id = g.id 
1

你需要一个额外的左外连接:

SELECT g.*, s.* 
FROM GAMES g LEFT JOIN 
    SCORES s 
    ON s.game_id = g.id LEFT OUTER JOIN 
    (SELECT n.game_id, MAX(n.created_on) AS max_score_date 
     FROM SCORES n 
     GROUP BY n.game_id 
    ) y 
    ON y.game_id = s.game_id AND y.max_score_date = s.created_on 

这个版本应该做你想要什么:

select g.*, s.* 
from (select g.*, 
      (select max(created_on) as maxcreatedon 
       from scores s 
       where s.game_id = g.game_id 
      ) as maxcreatedon 
     from games g 
    ) g left outer join 
    scores s 
    on s.game_id = g.game_id and 
     s.created_on = g.maxcreatedon 
+0

这正好解决一个问题而造成另一种。虽然无论在分数表中是否存在相应记录,它都会获得所有游戏,但它也会返回分数表中的所有记录,而不是基于created_on时间戳的最新记录。 – gsueagle2008 2012-08-08 17:11:14