【问题标题】:MySQL how to SUM() columns of two JOINed tables into a new column?MySQL如何将两个JOINed表的SUM()列转换为一个新列?
【发布时间】:2013-07-27 03:46:20
【问题描述】:

大家早上好/晚上好,

我正在尝试(左)将两个表加入一个表和SUM() 匹配ON fk_id = id... 语句的特定列的值。这就是表格的样子:

ws1 表:

ws2 表:

到目前为止我尝试过的查询:

SELECT
    alias.name alias,   
    (SUM(IFNULL(ws1.teamkills,0)) + SUM(IFNULL(ws2.teamkills,0))) teamkills
FROM pickup
    JOIN player ON player.pickup_id = pickup.id
    JOIN alias ON player.alias_id = alias.id
    LEFT JOIN weapon_stats_1 ws1 ON ws1.pickup_id = pickup.id AND ws1.player_id = player.id
    LEFT JOIN weapon_stats_2 ws2 ON ws2.pickup_id = pickup.id AND ws2.player_id = player.id
WHERE pickup.logfile_name = 'srv-20130725-2151-log' GROUP BY player.id

结果:

和:

SELECT
    alias.name alias,   
    (SUM(DISTINCT IFNULL(ws1.teamkills,0)) + SUM(DISTINCT IFNULL(ws2.teamkills,0))) teamkills
FROM pickup
    JOIN player ON player.pickup_id = pickup.id
    JOIN alias ON player.alias_id = alias.id
    LEFT JOIN weapon_stats_1 ws1 ON ws1.pickup_id = pickup.id AND ws1.player_id = player.id
    LEFT JOIN weapon_stats_2 ws2 ON ws2.pickup_id = pickup.id AND ws2.player_id = player.id
WHERE pickup.logfile_name = 'srv-20130725-2151-log' GROUP BY player.id

结果:

我知道SUM(DISTINCT.... ) 返回2,因为DISTINCT 只选择一个相同值的结果。

我的目标是获取两个teamkills 字段的SUM()s 并将它们加在一起。在示例中,它应该返回3,其中player_id4。我该怎么做?

编辑:

表“播放器”:

表'拾取':

【问题讨论】:

  • 请在pickup table for player_id = 4 中显示数据
  • 我添加了拾取和玩家表的截图。我认为您要的内容在player 表中。

标签: mysql join sum


【解决方案1】:

你需要两个依赖的子查询而不是 ws1+ws2 的连接,在这里 jonin 不起作用。
比如:

SELECT id, player_alias,
       ( SELECT sum( teamkills ) FROM ws1
         WHERE ws1.player_id = player.id )
        +
       ( SELECT sum( teamkills ) FROM ws2
         WHERE ws2.player_id = player.id ) as total
FROM player
JOIN alias ON ......

这里是SQLFiddle demo,查看第一个查询(以及下面的结果集)以更好地理解为什么会从连接中得到错误结果,以及连接的工作原理。

连接将一个表中的每条记录结合(粘合)到另一个表中的所有对应记录(符合连接条件),在您的情况下,它会生成 4 行包含重复数据的行。

本演示中的第三个查询是一个给出正确结果的相关子查询示例(例如本演示中的数据)。

【讨论】:

    【解决方案2】:

    你可能喜欢关注

    表 t1

     CREATE TABLE `t1` (
          `pik_id` int(11) NOT NULL AUTO_INCREMENT,
          `palyer_id` int(11) DEFAULT NULL,
          `amount` double DEFAULT NULL,
          UNIQUE KEY `pik_id` (`pik_id`)
        )
    
     ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
    

    表 t2

        CREATE TABLE `t2` (
      `playayer_id` int(11) NOT NULL AUTO_INCREMENT,
      `amount` double DEFAULT NULL,
      UNIQUE KEY `playayer_id` (`playayer_id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
    

    joinSUM 的查询

    SELECT playayer_id, t1.amount+t2.amount amount
    FROM
    (SELECT t1.pik_id,t1.palyer_id,SUM(t1.amount) amount FROM t1 GROUP BY t1.palyer_id)t1
    JOIN 
    (SELECT t2.playayer_id,t2.amount FROM t2)t2
    ON t1.palyer_id=t2.playayer_id
    GROUP BY playayer_id
    
    
        playayer_id amount
               1    133
               2    152
               3    1076
    

    希望你的问题能通过这种方式解决。

    【讨论】:

      【解决方案3】:

      不使用相关子查询的可能解决方案

      SELECT a.name alias, SUM(q.teamkills) teamkills
        FROM
      (
        SELECT player_id, teamkills
          FROM weapon_stats_1 w JOIN pickup p
            ON w.pickup_id = p.id
         WHERE p.logfile_name = 'srv-20130725-2151-log'
         UNION ALL
        SELECT player_id, teamkills
          FROM weapon_stats_2 w JOIN pickup p
            ON w.pickup_id = p.id
         WHERE p.logfile_name = 'srv-20130725-2151-log'
      ) q JOIN player p
          ON q.player_id = p.id JOIN alias a
          ON p.alias_id = a.id
       GROUP BY a.name
      

      样本输出:

      |别名 |团队杀戮 | ---------------------- |别名4 | 3 |

      这里是SQLFiddle演示

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-08
        • 2022-01-22
        • 1970-01-01
        • 2016-05-27
        相关资源
        最近更新 更多