2012-08-08 4 views
2

J'ai deux tablesgauche Rejoignez au plus récent enregistrement

Jeux et Scores:

jeux a un ID de clé primaire

scores a game_id qui fait référence games.id et créé sur entre autres domaines.

Je tente d'adapter le deuxième exemple dans la réponse acceptée de ce question pour répondre à mes besoins.

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 

il fonctionne presque, il obtient l'entrée la plus récente dans la table de score pour chaque jeu. Cependant, il ne renvoie que les jeux qui ont une entrée correspondante dans la table de score. et j'en ai besoin pour retourner tous les jeux dans la table sans tenir compte de s'ils ont une entrée dans la table de score. En lisant la question précédemment citée, j'ai supposé que la jointure gauche accomplirait.

Répondre

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

Vous avez besoin d'un externe gauche supplémentaire rejoindre:

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 

Cette version devrait faire ce que vous voulez:

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

qui résout un problème, mais crée une autre. alors qu'il obtient tous les jeux sans tenir compte de l'existence d'un enregistrement correspondant dans la table de scores, il renvoie également tous les enregistrements de la table de scores plutôt que le dernier en fonction de l'horodatage created_on. – gsueagle2008

Questions connexes