左加入最近的记录

时间:2012-08-08 17:01:48

标签: mysql sql

我有两张桌子

游戏和分数:

游戏有一个主键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

它几乎可以工作,它获得每个游戏的得分表中的最新条目。但是它只返回在得分表中有相应条目的游戏。如果他们在得分表中有一个条目,我需要它返回表格中的所有游戏。从阅读前面提到的问题我假设左连接将完成。

2 个答案:

答案 0 :(得分: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 :(得分: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