2017-04-13 43 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 
相關問題