2009-07-20 10 views
0

に一定に対応し、テーブルの上に、その後、playerstriesconversionspenaltiesdropgoalsという名前の他のテーブルの名前、私がしています。 player_idに対する罰則のconversions MySQLの - 困りカウントのidの他のテーブル

  • 数にplayer_idための変換のtries
  • 数にplayer_idための試行の

    • 数:

      私はplayersからplayer_idを取得する必要があり、その後、次のカウントpenalties

    • player_idのドロップゴール数dropgoals

    このすべては、各ゲームに約15人のプレイヤーが存在するため、一度に起こる必要があります。サイトはラグビーに関連しています。

    SELECT players.player_id, players.number, CASE WHEN (COUNT(tries.player_id) = 0) THEN ' ' ELSE COUNT(tries.player_id) END AS nrTries FROM players LEFT JOIN tries ON players.player_id = tries.player_id WHERE players.team_id IS NULL GROUP BY players.player_id ORDER BY players.number

    それはplayersテーブルからすべてのプレーヤーを選択して、彼らの試みを数えますが、できるだけ早く私は、次のように変更して、それは私にエラーを与える:作品私は以下のことを試してみました

    、 :

    SELECT players.player_id, players.number, player.name, CASE WHEN (COUNT(tries.player_id) = 0) THEN ' ' ELSE COUNT(tries.player_id) END AS nrTries FROM players, player LEFT JOIN tries ON players.player_id = tries.player_id WHERE players.player_id = player.player_id AND players.team_id IS NULL GROUP BY players.player_id ORDER BY players.number

    それは次のエラーを与えます

    Unknown column 'players.player_id' in 'on clause'

    誰かがこれを手伝ってもらえますか、私は数日間苦労していますか?事前に

    おかげ

    //編集:

    こんにちは、すべては、私が言う、プレイヤーは複数のタイプに獲得しているときに、このコードはことを除いて、見事に動作しますが、現在、非常に愚かな感じ試行錯誤、試行錯誤を繰り返し、それぞれのタイプの数を誤って計算し、すべて同じにします。

    私の選手は1ペナルティと3ドロップゴールを記録し、3ペナルティと3ドロップゴールを出力したとしましょう。何が間違っているのか分かりません。

    ここ

    は私のクエリです:

    SELECT players.player_id, players.number, player.name, player.surname, 
    CASE WHEN (COUNT(tries.player_id) = 0) THEN '& nbsp;' ELSE COUNT(tries.player_id) END AS nrTries, 
    CASE WHEN (COUNT(conversions.player_id) = 0) THEN '& nbsp;' ELSE COUNT(conversions.player_id) END AS nrConversions, 
    CASE WHEN (COUNT(dropgoals.player_id) = 0) THEN '& nbsp;' ELSE COUNT(dropgoals.player_id) END AS nrDropgoals, 
    CASE WHEN (COUNT(penalties.player_id) = 0) THEN '& nbsp;' ELSE COUNT(penalties.player_id) END AS nrPenalties 
    FROM players 
    LEFT JOIN tries ON players.player_id = tries.player_id AND tries.game_id = '$game_id' 
    LEFT JOIN conversions ON players.player_id = conversions.player_id AND conversions.game_id = '$game_id' 
    LEFT JOIN dropgoals ON players.player_id = dropgoals.player_id AND dropgoals.game_id = '$game_id' 
    LEFT JOIN penalties ON players.player_id = penalties.player_id AND penalties.game_id = '$game_id' 
    LEFT JOIN player ON players.player_id = player.player_id 
    WHERE players.player_id = player.player_id AND players.team_id IS NULL AND players.game_id = '$game_id' 
    GROUP BY players.player_id ORDER BY players.number 
    

    ご注意: $ game_idは、PHPの変数です。
    &とnbspの間にスペースを入れました。それ以外の場合は、SOに出力されません。

    誰かが正しい方向に向いていますか?

  • +0

    なぜ以前の提案に従っていませんか? – hobodave

    +0

    私の3番目の答えはこれをカバーしていませんか?私はあなたのさらなる編集を本当に理解していないので、あなたのデータを明確にして間違っていますか? – cletus

    答えて

    1

    私は、あなたがCletusが正しい解決策を持っていた理由を少し混乱させ、元の質問を更新する際にそれを使用しないように進めました。それは、クレタスの解決策は少し離れていると言いますが、SUM()ではなくCOUNT()が必要です。次のことを試してみてください。

    SELECT players.player_id, 
    (SELECT COUNT(*) FROM tries WHERE player_id = players.player_id) tries, 
    (SELECT COUNT(*) FROM penalties WHERE player_id = players.player_id) penalties 
    FROM players; 
    

    これは代わりに、私もあなたのアプリケーションコードでそれを扱うお勧めします& NBSPの0を返します。もしが本当になら、CASEの混乱を追加することができます。& nbspをmysqlから取得します。

    +0

    これは明らかに削除されていますが、結合、追加、グループ化を追加すると機能します。 – hobodave

    +0

    だから私が間違っていれば私を修正してください。私は 'LEFT JOIN'を入れ子にした' SELECT'文で置き換える必要があります。私は 'CASE'を使用しました。なぜなら、MySQLで検証を行う方が速く、PHPの検証が必要ないと思ったからです。何を指示してるんですか? –

    0

    なぜ2番目のクエリは "player"を参照していますか?私はあなたが他の場所でそのようなテーブルに言及しているのを見ることはありません...( "FROM players、player")それが熟考されていることを確認するだけです。

    明示的な結合(例:LEFT JOIN)と暗黙的な結合(例:「FROM players、player」)を混同しないようにすると、構造の一貫性を保つのに役立ちます。

    +0

    私は 'player'テーブルからプレーヤー名が必要です。私は' CASE'ステートメントの前に参照しています –

    3

    あなたはそこにプレイヤーごとに、関連する各テーブル内のレコードは1つであり、それはそこではない場合は、NULLを表示させていただきますと仮定すると、データについて十分に特定されてなくています

    SELECT player_id, tries, conversions, penalties, dropgoals 
    FROM players p 
    LEFT JOIN tries t ON t.player_id = p.player_id 
    LEFT JOIN conversions c ON c.player_id = p.player_id 
    LEFT JOIN penalties e ON e.player_id = p.player_id 
    LEFT JOIN dropgoals d ON d.player_id = p.player_id 
    

    これはできます

    SELECT player_id 
    (SELECT tries FROM tries WHERE player_id = p.player_id) tries, 
    (SELECT conversions FROM conversions WHERE player_id = p.player_id) conversions, 
    (SELECT penalties FROM penalties WHERE player_id = p.player_id) penalties, 
    (SELECT dropgoals FROM dropgoals WHERE player_id = p.player_id) dropgoals 
    FROM players p 
    

    パフォーマンスはデータベースエンジンによって異なる場合があります。あなたはこれを合計する必要がある場合は、その後にそれを変更します。

    SELECT player_id 
    (SELECT SUM(tries) FROM tries WHERE player_id = p.player_id) tries, 
    (SELECT SUM(conversions) FROM conversions WHERE player_id = p.player_id) conversions, 
    (SELECT SUM(penalties) FROM penalties WHERE player_id = p.player_id) penalties, 
    (SELECT SUM(dropgoals) FROM dropgoals WHERE player_id = p.player_id) dropgoals 
    FROM players p 
    

    上記のいずれかが必要であれば、0の代わりにNULLを返すようにIFNULL()または類似の機能を使用することができます。

    +0

    Thanks Cletus、私はその複数の左の結合を試したところ、うまくいきました!ただ、新しい答えがないかチェックして、あなたにも解決策があったのを見ました。あなたのトラブルのおかげで、あなたは本当に最高です。 –

    +0

    こんにちは、クレタス、あなたの答えに解決策を削除して申し訳ありませんが、それはスコアリングの種類を数えましたが、最終的に私の質問を解決しなかったからです。 –

    関連する問題