2

私は2つのテーブルを持っています

ゲームとスコア:

ゲームには主キーIDがあります

スコアには、games.idを参照し、他のフィールドで作成されたgame_idがあります。

私は、この質問の受け入れられた回答の2番目の例を、自分のニーズに合うように適合させようとしています。

  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 に答える