2012-04-05 4 views
2

私は2つのテーブル、tblPlayersとtblMatchesを持つデータベースを持っています。複数の列のエントリを数えるSQLクエリ

tblPlayersには、playerID、playerNameというフィールドがあります。

tblMatchesには、matchID、scorer1ID、scorer2ID、scorer3IDが含まれています。

プレーヤーが得点したゴール数をカウントし、playerIDで返すクエリを実行する必要があります。

私は次のことを試してみました:必要に応じて

SELECT 
tblPlayers.playerID, tblPlayers.playerName, count(*) AS goals 
FROM 
tblPlayers, matches 
WHERE 
(tblPlayers.playerID = tblMatches.scorer1ID 
OR 
tblPlayers.playerID = tblMatches.scorer2ID 
OR 
tblPlayers.playerID = tblMatches.goalscorer3ID) 
GROUP BY tblPlayers.playerID 
ORDER BY goals DESC 

しかし、これは(カウント機能は、プレイヤーがゲーム内で複数のゴールを決めることができるという事実のために許可していないとして、機能していませんたとえば、プレーヤーが3つのゴールを獲得した場合、そのスコアは、scorer1IDフィールド、scorer2IDフィールド、およびscorer3IDフィールドに表示されますが、カウントは3になる必要があるときに1の値を返します。

私はこれを解決しようとしている最後の数日間、私の髪を引き裂いてきた!どんな助けでも大歓迎です。

+1

試合に3つ以上のゴールがあるとどうなりますか? – barsju

+0

このようにテーブルを設定しましたか?私はこれを行うより効率的な方法があると思う。 – zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz

答えて

2
SELECT 
    playerID, 
    playerName, 
    SUM(goals) AS goals 
FROM 
(
    SELECT p.playerID, p.playerName, COUNT(*) AS goals 
    FROM 
     tblPlayers p 
     JOIN tblMatches m ON m.scorer1ID = p.playerID 
    GROUP BY p.playerID, p.playerName 

    UNION ALL 

    SELECT p.playerID, p.playerName, COUNT(*) AS goals 
    FROM 
     tblPlayers p 
     JOIN tblMatches m ON m.scorer2ID = p.playerID 
    GROUP BY p.playerID, p.playerName 

    UNION ALL 

    SELECT p.playerID, p.playerName, COUNT(*) AS goals 
    FROM 
     tblPlayers p 
     JOIN tblMatches m ON m.scorer3ID = p.playerID 
    GROUP BY p.playerID, p.playerName 
) sub 
GROUP BY playerID, playerName 

かは、ここでは1回のパスでそれをしないクエリです:

ひどいテーブルデザインですが、あなたはそれで立ち往生している場合は、以下を行う必要があります
SELECT 
    p.playerID, 
    p.playerName, 
    SUM (
     CASE WHEN p.playerID = m.scorer1ID THEN 1 ELSE 0 END + 
     CASE WHEN p.playerID = m.scorer2ID THEN 1 ELSE 0 END + 
     CASE WHEN p.playerID = m.scorer3ID THEN 1 ELSE 0 END 
    ) AS goals 
FROM 
    tblPlayers p 
    JOIN tblMatches m ON p.playerID IN (m.scorer1ID, m.scorer2ID, m.scorer3ID) 
GROUP BY p.playerID, p.playerName 
+0

+1と今削除された答えのupvoteに感謝します。私はあなたが私のことを見る前に、あなたがそれを試していたと確信しています。 JOINのbtwに 'IN'をうまく使います。 –

+0

それは素晴らしいです、多くのおかげであなたの助けに感謝します。心から感謝する。 –

0

SELECT 
tblPlayers.playerID, tblPlayers.playerName, 
(select count(*) from tblMatches m where p.playerId = m.Scoreer1Id) 
+ 
(select count(*) from tblMatches m where p.playerId = m.Scoreer2Id) 
+ 
(select count(*) from tblMatches m where p.playerId = m.Scoreer3Id) 
from tblPlayers p 
0

これを試してください。埋め込みセレクトステートメントを使用して、各コラムにプレーヤーが表示される回数を合計します

SELECT tblPlayers.playerID, tblPlayers.playerName, ((SELECT COUNT(*) FROM tblPlayers, matches WHERE tblPlayers.playerID = tblMatches.scorer1ID) + (SELECT COUNT(*) FROM tblPlayers, matches WHERE tblPlayers.playerID = tblMatches.scorer2ID) + (SELECT COUNT(*) FROM tblPlayers, matches WHERE tblPlayers.playerID = tblMatches.scorer2ID)) As [GoalsScored] 
FROM tblPlayers 
WHERE 
(tblPlayers.playerID = tblMatches.scorer1ID 
OR 
tblPlayers.playerID = tblMatches.scorer2ID 
OR 
tblPlayers.playerID = tblMatches.goalscorer3ID) 
GROUP BY tblPlayers.playerID 
ORDER BY goals DESC 
関連する問題