0

我有一个名为 的表players,然后是其他名为tries, conversions, penalties,的表dropgoals

我需要得到player_idfrom players,然后计算以下内容:

  • player_idin的尝试次数tries
  • player_idin的转化次数conversions
  • player_idin的处罚次数penalties
  • player_idin的丢球数dropgoals

这一切都需要一次性完成,因为每场比赛大约有十五名球员,该网站与橄榄球有关。

我尝试了以下方法,它有效:

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

您对数据还不够具体,但是,假设每个玩家的每个关联表中有一条记录,并且如果当时不存在,您很乐意显示 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() 或类似函数返回 0 而不是 NULL。

于 2009-07-20T15:06:12.817 回答
1

我有点困惑为什么你说 Cletus 有正确的解决方案,并在更新你原来的问题时继续不使用它。也就是说,Cletus 的解决方案略有偏差,您需要 COUNT() 而不是 SUM()。尝试以下操作:

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;

这将返回 0 而不是   我建议在您的应用程序代码中处理它。如果您真的想从 mysql 获取  ,您可以添加 CASE 混乱。

于 2009-07-21T16:17:33.183 回答
0

为什么第二个查询引用“玩家”?我没有看到你在其他任何地方提到过这样的桌子......(“来自玩家,玩家”)只是确保这是故意的。

避免将显式连接(例如“LEFT JOIN”)与隐式连接(例如“FROM player, player”)混用可能会有所帮助,以保持结构一致。

于 2009-07-20T15:01:32.760 回答