0

という名前のテーブルがあり、players次に、、、、という名前の他のテーブルがtriesあります。conversionspenaltiesdropgoals

player_idfrom を取得してからplayers、以下をカウントする必要があります。

  • player_idの試行回数tries
  • player_idのコンバージョン数conversions
  • のペナルティのplayer_idpenalties
  • 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 に出力されません。

誰かが私を正しい方向に向けることができますか?

4

3 に答える 3

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

上記のいずれも、必要に応じて、IFNULL()または同様の関数を使用して、NULLの代わりに0を返すことができます。

于 2009-07-20T15:06:12.817 に答える
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が返されますが、アプリケーションコードでこれを処理することをお勧めします。本当にmysqlから&nbspを取得したい場合は、CASEの混乱を追加できます。

于 2009-07-21T16:17:33.183 に答える
0

2 番目のクエリが「プレイヤー」を参照するのはなぜですか? 他の場所でそのようなテーブルについて言及しているとは思いません... ("FROM プレイヤー、プレイヤー") 意図的なものであることを確認するだけです。

構造の一貫性を保つために、明示的な結合 (「LEFT JOIN」など) と暗黙的な結合 (「FROM プレーヤー、プレーヤー」など) を混在させないようにすることが役立つ場合があります。

于 2009-07-20T15:01:32.760 に答える