2

tblPlayers と tblMatches の 2 つのテーブルを持つデータベースがあります。

tblPlayers には次のフィールドが含まれます: playerID、playerName。

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

クエリを実行して、プレーヤーが獲得したゴールの合計数をカウントし、それをプレーヤー ID と共に返す必要があります。

私は次のことを試しました:

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 つのゴールを決めた場合、彼の ID は scorer1ID フィールド、scorer2ID に表示されます)。 field と scorer3ID フィールドを使用しますが、カウントは 3 である必要がある場合に 1 の値を返すだけです)。

それが理にかなっていることを願って、私はこれを解決しようとしてここ数日間髪を引き裂いています! どんな助けでも大歓迎です。

4

3 に答える 3

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
于 2012-04-05T21:41:07.560 に答える
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
于 2012-04-05T21:42:22.413 に答える
0

これを試して。埋め込まれた select ステートメントを使用して、プレーヤーが各列に表示される回数を合計しますn

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
于 2012-04-05T21:44:55.647 に答える