在 mysql 中使用 SUM 和多个连接

Posted

技术标签:

【中文标题】在 mysql 中使用 SUM 和多个连接【英文标题】:Using SUM with multiple joins in mysql 【发布时间】:2012-12-16 10:55:30 【问题描述】:

我一直在寻找解决这个问题的方法,有很多类似的问题,但没有一个能帮助我解决问题的正确答案。

首先,我的问题/问题:

    我想对多重连接查询中的某些列进行求和和计数 不可能有多个连接吗?我必须嵌套SELECT 查询吗?

这是我的数据库的 SQL 转储以及示例数据:http://pastie.org/private/vq7qkfer5mwyraudb5dh0a

这是我认为可以解决问题的查询:

SELECT firstname, lastname, sum(goal.goal), sum(assist.assist), sum(gw.gw), sum(win.win), count(played.idplayer) FROM player
LEFT JOIN goal USING (idplayer)
LEFT JOIN assist USING (idplayer)
LEFT JOIN gw USING (idplayer)
LEFT JOIN win USING (idplayer)
LEFT JOIN played USING (idplayer)
GROUP BY idplayer

我希望生成一个表格,其中目标、助攻、gw、win 和 play 的列是该列中每一行的总和/计数,如下所示:(使用提供的示例数据)

+-----------+----------+------+--------+----+-----+--------+
| firstname | lastname | goal | assist | gw | win | played |
+-----------+----------+------+--------+----+-----+--------+
| Gandalf   | The White|   10 |      6 |  1 |   1 |      2 |
| Frodo     | Baggins  |   16 |      2 |  1 |   2 |      2 |
| Bilbo     | Baggins  |    7 |      3 |  0 |   0 |      2 |
+-----------+----------+------+--------+----+-----+--------+

那么,再次重复上述问题,是否可以通过一个查询和多个连接来实现?

如果您提供解决方案/查询,请解释一下!我是正确的关系数据库的新手,在这个项目之前我从未使用过联接。如果您在必要时避免使用别名,我也将不胜感激。

我在没有 sum 和 grouping 的情况下运行了上面的查询,并且我为我执行 SELECT 的每一列得到一组行,我怀疑这些行随后会相乘或相加,但我的印象是分组和/ 或做 sum(TABLE.COLUMN) 会解决这个问题。

另一件事是,我认为,执行 SELECT DISTINCT 或任何其他 DISTINCT 操作将不起作用,因为这会遗漏一些(“重复”)结果。

PS。如果重要的话,我的开发机器是 WAMP,但版本将在 ubuntu/apache/mysql/php 上。

【问题讨论】:

您在 DML 上花费了大量时间,所以请创建一个 sqlfiddle。 我不知道 sqlfiddle,ic3be3rg 已经在他的答案中创建了一个,所以我现在不会。 【参考方案1】:

要了解您没有得到预期答案的原因,请查看以下查询:

SELECT * FROM player LEFT JOIN goal USING (idplayer)

如您所见,左侧的行与右侧的匹配行重复。每次加入都会重复该过程。这是您查询的原始数据:

SELECT * FROM player
LEFT JOIN goal USING (idplayer)
LEFT JOIN assist USING (idplayer)
LEFT JOIN gw USING (idplayer)
LEFT JOIN win USING (idplayer)
LEFT JOIN played USING (idplayer)

然后将这些重复值用于 SUM 计算。需要在连接行之前计算 SUM:

SELECT firstname, lastname, goals, assists, gws, wins, games_played
FROM player
INNER JOIN 
  (SELECT idplayer, SUM(goal) AS goals FROM goal GROUP BY idplayer) a
  USING (idplayer)
INNER JOIN
  (SELECT idplayer, SUM(assist) AS assists FROM assist GROUP BY idplayer) b
  USING (idplayer)
INNER JOIN
  (SELECT idplayer, SUM(gw) AS gws FROM gw GROUP BY idplayer) c
  USING (idplayer)
INNER JOIN
  (SELECT idplayer, SUM(win) AS wins FROM win GROUP BY idplayer) d
  USING (idplayer)
INNER JOIN
  (SELECT idplayer, COUNT(*) AS games_played FROM played GROUP BY idplayer) e
  USING (idplayer)

SQLFiddle

【讨论】:

正如我当时所怀疑的那样!感谢您的快速回复。我会摆弄查询以更好地理解它:) 如果先计算sum再join,是不是表示有些计算的sum在计算后会被丢弃?我的意思是,它不会计算不需要的总和吗?

以上是关于在 mysql 中使用 SUM 和多个连接的主要内容,如果未能解决你的问题,请参考以下文章

MySQL sum 和 distinct 在具有多个连接的另一列上

MySql:查询优化(多个左连接)

将 concat 和 sum 与左连接 mysql 分组

MYSQL 更新使用 sum() 结果跨多个表

多个mysql表列的Sum,Subtract和Join

如何对mysql中多个表的字段求和?