2017-04-13 256 views
0

我有一个足球比赛中所有历史比赛的比赛表。它大约有30000场比赛,我的挑战是为特定队伍和其他队伍找回胜利,平局和失败。如何根据Group BY列对两个查询的结果进行求和?

对于我的问题我就用画,为了找回我的画我有2种可能的方案:

  1. 球队是主队

  2. 队是客场团队

所以根据我的数据的查询在我的队是主队的第一个场景是这样的:

SELECT 
    matches.away_team as VS, 
    COUNT(matches.idmatch) AS TIES 
FROM 
    my_football_database.matches 
WHERE 
    home_team = 14 
    AND home_team_goals = away_team_goals 
    AND aet = "N" AND PK = "N" 
GROUP BY 
    away_team 
LIMIT 5; 

输出:

+------+------+ 
| VS | TIES | 
+------+------+ 
| 2 | 1 | 
| 3 | 3 | 
| 4 | 2 | 
| 8 | 1 | 
| 9 | 3 | 
+------+------+ 

第二种情况是,当我的球队是客队,所以它是这样的:

SELECT 
    matches.home_team as VS, 
    COUNT(matches.idmatch) AS TIES 
FROM 
    my_football_database.matches 
WHERE 
    away_team = 14 
    AND home_team_goals = away_team_goals 
    AND aet = "N" AND PK = "N" 
GROUP BY 
    home_team 
LIMIT 5; 

输出:

+------+------+ 
| VS | TIES | 
+------+------+ 
| 2 | 4 | 
| 3 | 2 | 
| 7 | 1 | 
| 8 | 3 | 
| 9 | 1 | 
+------+------+ 

由于你可以看到一个例子:

  • 当我的团队(ID = 14)被打的主队VS团队ID = 3,共3场比赛的结束为平局
  • 在第二个结果是,当我的球队(ID = 14)是作为客场对阵球队ID = 3,总共2场比赛结束为平局

如何根据“VS”ID结果TIES的结果?比如,在列出作为主队参赛的球队的所有关系之后,根据客队分组,并列出作为客队参赛队的所有关系,由主队归类,根据“Vs”ID加入两列。

的示例结果在这种情况下将是:

+------+------+ 
| VS | TIES | 
+------+------+ 
| 2 | 5 | 
| 3 | 5 | 
| 4 | 2 | 
| 7 | 1 | 
| 8 | 4 | 
| 9 | 4 | 
+------+------+ 

注:我得去找一个单一的查询,可以给我一个表的所有胜点,丢失,并绘制了给予球队,他们与他们对阵的球队分组。

这是14个总的情况。主场和客场抽签(2),主客场胜利,获奖并受到处罚(6)。主场和客场失去常规,获奖和罚球(6)。

因此,我并不是在寻找可能解决Draws交易的一段代码,而更像是一个关于如何研究,研究或实施这个问题的提示。我的第一个想法是分别创建每个场景,然后将它们用作子查询,但我被告知这对性能不方便。

+0

我无法理解你的描述。你能展示一个期望结果的样本吗? – Barmar

+0

我刚加了一个,试图解释得更好。谢谢! –

回答

0

使用CASE结构:

select 
    otherteam, 
    count(case when mygoals > othergoals then 1 end) as won, 
    count(case when mygoals = othergoals then 1 end) as ties, 
    count(case when mygoals < othergoals then 1 end) as lost 
from 
(
    select 
    11 as myteam, 
    case when home_team = 11 then away_team else home_team end as otherteam, 
    case when home_team = 11 then home_team_goals else away_team_goals end as mygoals, 
    case when home_team = 11 then away_team_goals else home_team_goals end as othergoals 
    from mydb.matches 
    where (home_team = 11 or away_team = 11) 
) whoiswho 
group by otherteam; 

(哎呀,对不起,我想这是不是 “像HINT” 略多。)

+0

这有点解决了一切,天才。虽然我会坐下来研究你的案例结构。谢谢! –

0

使用两个查询中的UNION,然后将这些行与同一个VS列相加。

SELECT VS, SUM(TIES) AS TIES 
FROM (
    (SELECT matches.away_team as VS, count(matches.idmatch) as TIES 
    from my_football_database.matches WHERE home_team = 14 
    AND home_team_goals = away_team_goals 
    AND aet = "N" AND PK = "N" 
    GROUP BY away_team 
    LIMIT 5) 
    UNION ALL 
    (SELECT matches.home_team as VS, count(matches.idmatch) as TIES 
    from my_football_database.matches WHERE away_team = 14 
    AND home_team_goals = away_team_goals 
    AND aet = "N" AND PK = "N" 
    GROUP BY home_team 
    LIMIT 5)) AS u 
GROUP BY VS