2

我有两张桌子

游戏和分数:

游戏有一个主键 ID

Scores 具有引用 games.id 并在其他字段中创建的 game_id。

我正在尝试调整这个问题的已接受答案中的第二个示例以满足我的需要。

  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

它几乎可以工作,它会在每场比赛的得分表中获取最新条目。但是它只返回在得分表中有相应条目的游戏。我需要它来返回表中的所有游戏,无论它们是否在得分表中有条目。从阅读之前引用的问题中,我假设左连接会完成。

4

2 回答 2

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
于 2012-08-08T17:18:32.590 回答
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
于 2012-08-08T17:07:12.217 回答