我有一个包含两个表的数据库:tblPlayers 和 tblMatches。
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
但是,这并不能按要求工作,因为计数函数不允许球员在一场比赛中进球超过一个进球(例如,如果球员进球三个进球,他的 ID 会出现在 Scorer1ID 中)字段、scorer2ID 字段和 Scorer3ID 字段,但计数只返回值 1,而当需要为 3 时)。
希望这是有道理的,过去几天我一直在努力解决这个问题!非常感谢任何帮助。
最佳答案
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
或者,这里有一个一次性执行此操作的查询:
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
关于SQL 查询对多列中的条目进行计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10036311/