对足球数据库的SQL查询,如果记录不存在则假设为0

时间:2013-12-15 11:56:10

标签: mysql sql

Nove的SQL只是试图混淆和学习。

我创建了一个包含已删除足球数据的数据库。我有一个表格,其中包含游戏中的每个动作(角落,目标等)以及有关此动作的各种细节(时间,参与的玩家)。我正在尝试编写一个SQL,它将计算出团队得分和承认的平均目标数。我的SQL语句仅在有目标时才有效。有些游戏团队不会得分或不会让步,然后行动栏中就没有“目标”项目。

例如,对于已经打了5场比赛并且打进4球,2球,0球,0球和1球的A队。当它应该是7/5时,它会将平均值计算为7/3,因为它没有看到没有目标的游戏。

还有另一张桌子,其中包含每场比赛的game_id和所涉及的球队,因此我尝试使用它来指定每场比赛,而不仅仅是实际发生动作的比赛。它没有用,所以我决定发帖。

def averageFor(team_id, action):
cur.execute("""SELECT count(espn.actions.action_name)/count(DISTINCT espn.game_details.game_id)
            FROM espn.game_details
            INNER JOIN espn.actions
            ON espn.game_details.game_id = espn.actions.game_id
            WHERE (home_team = (%s) OR away_team = (%s))
            AND action_name = (%s)
            AND espn.actions.team_id = (%s)""", (team_id, team_id, action, team_id))
data = cur.fetchall()
return data

在这个SQL中,team_id是我们正在研究的团队的id号,而action是我们正在考虑的行动。 Actions是包含操作的表(每个操作1行),game_details是包含每个游戏信息的表。

我希望这是可以理解的,请原谅我可能的愚蠢,因为我是初学者。

EDIT ///

以下是要求的信息

Actions:
action_id    - Primary key
game_id
action name  - eg 'Goal', 'Sub'
team_id      - ID of the team the action is attributed to
time         - an int representing the time of the match that it happened
player_1     - ID of player involved in action
player_2     - ID of player involved in action if there was one

game_details:
game_id
home_team    - ID of home team
away_team

我需要做的是获取特定团队所玩的所有game_ids。然后我希望能够计算得分的平均进球数(包括他们在计算中未得分的比赛)

2 个答案:

答案 0 :(得分:1)

这样的东西?

SELECT AVG(
SELECT COUNT(*) as goal_count 
    FROM Actions 
    JOIN game_details ON Actions.game_id=game_details.game_id 
    WHERE [action name] = 'goal' GROUP BY actions.team_id
) 

答案 1 :(得分:1)

通过查询获得所选团队为每个游戏打进的目标数量是一个简单的组:

SELECT game_id, COUNT(*) as goals FROM actions
    WHERE team_id = 1 AND action_name = 'goal'
    GROUP BY game_id;

这个行集没有任何没有目标的游戏记录,但是您可以将其加入game_id到game_details表,其中所选团队的每一行都在主页或离开列中。

左连接意味着您将从左表中获得满足WHERE条件的每一行,并且对于每个行,如果匹配ON条件,您将获得目标数,如果存在则为NULL不是。

例如,如果您想获取team_id = 1的信息:

SELECT 
  SUM(a.goals) as goals_scored,
  COUNT(*) as games_played,
  SUM(a.goals)/COUNT(*) as avg_goals
FROM game_details g
LEFT JOIN
  ( SELECT game_id, COUNT(*) as goals FROM actions
    WHERE team_id = 1 AND action_name = 'goal'
    GROUP BY game_id ) a
ON g.game_id = a.game_id
WHERE g.home_team = 1 OR g.away_team = 1;

请参阅SQLFiddle example