2012-11-10 113 views
0

我在我的MySQL數據庫MySQL查詢全部加入

dc_match_entries with player_id, goals, yellow cards, own goals etc for each match 
dc_player player_id, team_id etc etc 
dc_team team_is, some stuff etc etc 

三個表,我有此查詢過

SELECT 
    dc_player. *, 
    dc_team.name AS team_name, 
    dc_team.abbr_name AS team_abbr_name, 
    COUNT(dc_match_entry.player_id) AS played, 
    AVG(dc_match_entry.vote) AS vote_average, 
    SUM(dc_match_entry.goal) AS goal_sum, 
    SUM(dc_match_entry.own_goal) AS own_goal_sum, 
    SUM(dc_match_entry.vote) *10 
     + SUM(dc_match_entry.goal) *10 
     + SUM(dc_match_entry.r_card) *-10 
     + SUM(dc_match_entry.y_card) *-5 
     + SUM(dc_match_entry.own_goal) *-10 AS score, 
    SUM(dc_match_entry.y_card) AS y_card_sum, 
    SUM(dc_match_entry.r_card) AS r_card_sum 
FROM 
    dc_player, 
    dc_match_entry, 
    dc_team 
WHERE 
    dc_player.id = dc_match_entry.player_id AND 
    dc_player.team = dc_team.id 
GROUP BY 
    dc_player.id 

可悲的是這個查詢沒有顯示玩家這還沒有在任何出場比賽競爭(因爲他們沒有dc_match_entry條目)。我無法找到一個簡單的(也可能是清晰的)的方式來顯示這些球員太(全參加?)

PS: 這個查詢嵌套到一個更大的:

SELECT 
    L.id, 
    L.role, 
    L.first_name, 
    L.last_name, 
    L.birth_date, 
    L.team_name, 
    L.team_abbr_name, 
    L.team AS team_id, 
    L.photo, 
    L.email, 
    L.played, 
    L.vote_average, 
    L.goal_sum AS goal, 
    L.own_goal_sum AS own_goal, 
    L.score + 
     IFNULL(L.c_mvp, 0)*15 
     + IFNULL(unbeaten, 0)*50*IF(L.role='P', 1, 0) AS score, 
    L.y_card_sum AS y_card, 
    L.r_card_sum AS r_card, 
    IFNULL(L.c_mvp, 0) AS mvp, 
    IFNULL(unbeaten, 0) AS unbeaten 
FROM (
    SELECT * FROM (
     SELECT 
      dc_player. *, 
      dc_team.name AS team_name, 
      dc_team.abbr_name AS team_abbr_name, 
      COUNT(dc_match_entry.player_id) AS played, 
      AVG(dc_match_entry.vote) AS vote_average, 
      SUM(dc_match_entry.goal) AS goal_sum, 
      SUM(dc_match_entry.own_goal) AS own_goal_sum, 
      SUM(dc_match_entry.vote) *10 
       + SUM(dc_match_entry.goal) *10 
       + SUM(dc_match_entry.r_card) *-10 
       + SUM(dc_match_entry.y_card) *-5 
       + SUM(dc_match_entry.own_goal) *-10 AS score, 
      SUM(dc_match_entry.y_card) AS y_card_sum, 
      SUM(dc_match_entry.r_card) AS r_card_sum 
     FROM 
      dc_player, 
      dc_match_entry, 
      dc_team 
     WHERE 
      dc_player.id = dc_match_entry.player_id AND 
      dc_player.team = dc_team.id 
     GROUP BY 
      dc_player.id 
    ) LOL 
    LEFT JOIN (
     SELECT 
      COUNT(dc_match.mvp) c_mvp, 
      mvp AS player_id 
     FROM dc_match 
     WHERE 
      dc_match.mvp IS NOT NULL 
     GROUP BY dc_match.mvp 
    ) ROFL 
    ON ROFL.player_id = LOL.id 
    ORDER BY 
     LOL.score DESC 
) L 
LEFT OUTER JOIN(
    SELECT 
     dc_player.id, 
     COUNT(dc_match.id) AS unbeaten 
    FROM 
     dc_match, 
     dc_match_entry, 
     dc_player 
    WHERE 
     (
      (dc_player.team=dc_match.host AND 
      dc_match.guest_score=0 
      ) OR 
      (
       dc_player.team=dc_match.guest AND 
       dc_match.host_score=0 
      ) 
     ) AND 
     dc_player.id = dc_match_entry.player_id AND dc_match.id = dc_match_entry.match_id 
    GROUP BY 
     dc_player.id 
) I 
ON 
    L.id = I.id 
WHERE 
    L.team = 2 
GROUP BY 
    id 
ORDER BY 
    role DESC, score DESC 

回答

3

您需要使用一個LEFT JOIN這樣的:

SELECT ... 
FROM dc_player 
JOIN dc_team ON (dc_player.team = dc_team.id) 
LEFT JOIN dc_match_entry ON (dc_player.id = dc_match_entry.player_id) 
GROUP BY dc_player.id 

這將返回每次他們是否沒有任何匹配條目球員一行。