0

サッカーリーグの場合、2つのテーブルがあります。

  • 「teams」は、すべてのチームを一意のエントリ('id'、'team_name')として一覧表示するテーブルです。
  • 「matches」は、試合結果を示す表です。「home」列と「away」列に、各ゲーム結果を保存します。「home_team_id」および「away_team_id」は、チームテーブルへの関連付けです。

これは私のクエリがどのように見えるかです:

SELECT Teams, Sum(P) as 'Matches', Sum(W) as 'win', Sum(D) as 'draw', Sum(L) as 'lost',
       SUM(Pts) as 'points'
  FROM (
        SELECT home Teams, 1 P,
                IF (home > away,1,0) W,
                IF (home = away,1,0) D,
                IF (home < away,1,0) L,
                CASE 
                    WHEN home > away THEN 3
                    WHEN home = away THEN 1 
                    ELSE 0
                END PTS
          FROM `matches`

        UNION ALL
        SELECT away Teams, 1,
                IF (home < away,1,0),
                IF (home = away,1,0),
                IF (home > away,1,0),
                CASE 
                    WHEN home < away THEN 3
                    WHEN home = away THEN 1
                    ELSE 0
                END
          FROM `matches`
        ) AS ERG
GROUP BY Teams
ORDER BY SUM(Pts) DESC 

ここで、チームテーブルのチーム名(teams.team_name)が必要です。これを達成するために、私は運が悪かったいくつかの結合ステートメントを試しました。

チームテーブルには、試合に参加しなかったチームを含めることができることは明らかです。これらのチームは、結果がゼロで表示される必要があります。

したがって、私はLEFTJOINを試しました。

SELECT team_name AS 'Teams'
  FROM `teams`
  LEFT JOIN matches ON ( teams.id = matches.home_team_id )

最後のORDER行の直後。エラーメッセージが表示されました。私はMySQL5.1.44を使用しているので、ネストされた選択は問題になりません。

何か案が?

4

2 に答える 2

1

このようなことをしたいようですね。サブクエリを更新してhome_team_idとを含めaway_team_idたらJOINteamsテーブルに名前を返します。:

SELECT Teams, 
  Sum(P) as 'Matches',
  Sum(W) as 'win',
  Sum(D) as 'draw',
  Sum(L) as 'lost',
  SUM(Pts) as 'points',
  h.team_name as HomeTeam,
  a.team_name as AwayTeam
FROM
(
  SELECT home Teams,
    1 P,
    IF (home > away,1,0) W,
    IF (home = away,1,0) D,
    IF (home < away,1,0) L,
    CASE WHEN home > away THEN 3 WHEN home = away THEN 1 ELSE 0 END PTS,
    home_team_id,
    away_team_id
  FROM `matches`

  UNION ALL

  SELECT away Teams,
    1,
    IF (home < away,1,0),
    IF (home = away,1,0),
    IF (home > away,1,0),
    CASE WHEN home < away THEN 3 WHEN home = away THEN 1 ELSE 0 END,
    home_team_id,
    away_team_id
  FROM `matches`
) AS ERG
LEFT JOIN `teams` h
  on ERG.home_team_id = h.home_team_id
LEFT JOIN `teams` a
  on ERG.away_team_id = a.away_team_id
GROUP BY Teams, home_team_id, away_team_id
ORDER BY SUM(Pts) DESC 

コメントに基づいて#1を編集します。これが必要なようです(SQL Fiddle with Demoを参照)。

SELECT TeamId, 
  t.team_name,
  Teams, 
  Sum(P) as 'Matches', 
  Sum(W) as 'win', 
  Sum(D) as 'draw', 
  Sum(L) as 'lost',
  SUM(Pts) as 'points'
FROM 
(
  SELECT home_team_id TeamId, 
      home Teams, 1 P,
      IF (home > away,1,0) W,
      IF (home = away,1,0) D,
      IF (home < away,1,0) L,
      CASE 
          WHEN home > away THEN 3
          WHEN home = away THEN 1 
          ELSE 0
      END PTS
  FROM `matches`

  UNION ALL
  SELECT away_team_id TeamId,
       away Teams, 1,
       IF (home < away,1,0),
       IF (home = away,1,0),
       IF (home > away,1,0),
       CASE 
           WHEN home < away THEN 3
           WHEN home = away THEN 1
           ELSE 0
        END
   FROM `matches`
) AS ERG
LEFT JOIN `teams` t
  ON ERG.TeamId = t.id
GROUP BY Teams, TeamId
ORDER BY SUM(Pts) DESC 
于 2012-09-25T10:52:30.157 に答える
1

次のような外部結合を使用できます。

SELECT a.team_name, Sum(ERG.P) as 'Matches', Sum(ERG.W) as 'win', Sum(ERG.D) as 'draw', Sum(ERG.L) as 'lost',
       SUM(Pts) as 'points'
  FROM 
    Teams a
    left outer join
    (
    SELECT home Teams, 1 P,
            IF (home > away,1,0) W,
            IF (home = away,1,0) D,
            IF (home < away,1,0) L,
            CASE 
                WHEN home > away THEN 3
                WHEN home = away THEN 1 
                ELSE 0
            END PTS
      FROM `matches`

    UNION ALL
    SELECT away Teams, 1,
            IF (home < away,1,0),
            IF (home = away,1,0),
            IF (home > away,1,0),
            CASE 
                WHEN home < away THEN 3
                WHEN home = away THEN 1
                ELSE 0
            END
      FROM `matches`
    ) AS ERG
    on a.team_name=ERG.Teams
GROUP BY a.team_name
ORDER BY SUM(Pts) DESC 

それはあなたのためにうまくトリックをするはずです。

また、ユニオン、結合、外部結合、およびその他のあらゆる種類の機能について説明する、かなり長い質問と回答を作成しました。このような質問に回答するときにリンクします。それは非常に長くて詳細であり、それが進むにつれてすべてのステップを詳細に説明します。

于 2012-09-25T10:52:45.950 に答える