2011-02-05 12 views
0

このSQLクエリの目標は、ほとんどの戦闘勝利と勝利のカウントを持つユーザーを返すことです。このロジック(has_many、belongs_to association)のSQLクエリを書く方法は?

私は2つのテーブル:ユーザーと戦いがあります。

ユーザーは多くの戦いを持っている ファイトは、ユーザーに属する

ファイトは懸念の次の列があります。

  • challenger_id(user_idはFK)
  • challengee_id(user_idはFK)
  • challenger_won(ブール)

ご覧のとおり、ユーザーは挑戦者または挑戦者ですが、両方ではありません。

  • ユーザーがチャレンジャーで、チャレンジャーウォン= trueの場合、勝利とみなされます。
  • ユーザーがchallengeeで、challenger_won = falseの場合、勝者とみなされます。
  • challenger_won = nullの場合は無視してください。

これはどのようにSQLを記述しますか?

答えて

3

これはどうですか?

SELECT a.fighter, COUNT(*) AS wins 
    FROM (SELECT challenger_id AS fighter 
      FROM fights 
     WHERE challenger_won = TRUE 
     UNION ALL 
     SELECT challengee_id AS fighter 
      FROM fights 
     WHERE challenger_won = FALSE 
     ) AS a 
GROUP BY a.fighter; 

challenger_wonがNULLの場合は、必要に応じて、UNIONの両方のクエリは、行を無視します。

あなたはUNION ALL好きではない場合は、代わりに、使用することができます。

SELECT a.fighter, SUM(a.wins) AS wins 
    FROM (SELECT challenger_id AS fighter, 'R' AS role, COUNT(*) AS wins 
      FROM fights 
     WHERE challenger_won = TRUE 
     GROUP BY fighter, role 
     UNION 
     SELECT challengee_id AS fighter, 'E' AS role, COUNT(*) AS wins 
      FROM fights 
     WHERE challenger_won = FALSE 
     GROUP BY fighter, role 
     ) AS a 
GROUP BY a.fighter; 

をUNIONの最初の部分は(「チャレンジャーウォン」の)役割と戦闘機のように「R」との行を生成し、 IDと戦いの数を獲得した。 2番目の部分はロール( 'challengeE won'の場合)と戦闘機IDと戦いの数を獲得した 'E'の行を生成します。チャレンジャーとして3戦、チャレンジャーとして3戦を獲得した戦闘機の場合には、この役割が必要です。役割がなければ、同じ戦闘機とカウントを持つ2つのエントリーが1つに崩壊します。その後、各ロールの各戦闘員の勝利金額を合計します。

+0

最初のクエリを実行すると「すべての派生テーブルには別のエイリアスが必要です」というエラーが表示されます – keruilin

+0

@keruilin:有罪判決を受けました - 不足している 'AS a'句を追加しましたAS b 'の代わりに不明なテーブル/エイリアス' a 'エラーが発生します。私はコードを実行していません。 –

関連する問題