2017-04-13 7 views
0

私はサッカー(サッカー)部門で行われたすべての歴史ゲームとのマッチテーブルを持っています。それは約30000ゲームになり、私の挑戦は、残りのチームに対して、与えられたチームの勝利、引き分け、負けを取り戻すことです。私はちょうど私は、私は2つの可能なシナリオを持って描く取得するためには、描画に使用します私の質問についてはグループ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 | 
+------+------+ 

私のチームはアウェイチームである場合に、第2のシナリオがあるので、それはこのように書きます:

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)= 3チームID VSホームチームとしてプレーしていたとき、私のチーム(ID = 14)であったとき、3試合の合計は、2番目の結果ではタイ
  • として終了アウェイチーム対チーム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

私はちょうど1つを追加し、より良く説明しようとしました。ありがとう! –

答えて

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; 

(おっと、申し訳ありませんが、私は "ヒントのような" よりも少しだと思う。)

+0

これはすべて、天才を解決しました。私は座って、あなたのケースの構造を勉強します。ありがとう! –

0

2つのクエリの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 
関連する問題