【问题标题】:MySQL: UPDATE with SUM and JOINMySQL:使用 SUM 和 JOIN 进行更新
【发布时间】:2009-09-26 12:12:37
【问题描述】:

我正在尝试进行 SUM 并将其存储在另一个表中。 SUM 很简单:

SELECT award.alias_id, 
       SUM(award.points) AS points
FROM award 
INNER JOIN achiever ON award.id = achiever.award_id

我现在想存储它。我想出了如何逐行进行:

UPDATE aliaspoint 
   SET points  = (SELECT SUM(award.points) AS points 
                 FROM award 
           INNER JOIN achiever ON award.id = achiever.award_id
                WHERE achiever.alias_id = 2000) 
 WHERE alias_id = 2000;

我认为这样的事情可能会起作用,但我明白了:

ERROR 1111 (HY000): Invalid use of group function

UPDATE aliaspoint 
INNER JOIN achiever ON aliaspoint.alias_id = achiever.alias_id 
INNER JOIN award ON achiever.award_id = award.id 
SET aliaspoint.points = SUM(award.points) 

还有一些表定义可以提供帮助:

mysql> show create table aliaspoint;
| metaward_aliaspoint | CREATE TABLE `aliaspoint` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `alias_id` int(11) NOT NULL,
  `points` double DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `alias_id` (`alias_id`),
  KEY `aliaspoint_points` (`points`)
) ENGINE=MyISAM AUTO_INCREMENT=932081 DEFAULT CHARSET=latin1 |

mysql> show create table achiever;
| metaward_achiever | CREATE TABLE `achiever` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `modified` datetime NOT NULL,
  `created` datetime NOT NULL,
  `award_id` int(11) NOT NULL,
  `alias_id` int(11) NOT NULL,
  `count` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `achiever_award_id` (`award_id`),
  KEY `achiever_alias_id` (`alias_id`)
) ENGINE=MyISAM AUTO_INCREMENT=87784996 DEFAULT CHARSET=utf8 |

mysql> show create table award;
| metaward_award | CREATE TABLE `award` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `points` double DEFAULT NULL,
  PRIMARY KEY (`id`),
) ENGINE=MyISAM AUTO_INCREMENT=131398 DEFAULT CHARSET=utf8 |

【问题讨论】:

    标签: mysql sql mysql-error-1111


    【解决方案1】:

    您在以下位置缺少GROUP BY 子句:

    SET points = (SELECT SUM(award.points) AS points 
                    FROM award 
              INNER JOIN achiever ON award.id = achiever.award_id
                   WHERE achiever.alias_id = 2000) 
    

    AWARDACHIEVER 表上没有足够的信息,因此我建议在更新 UPDATE 语句之前对此进行测试:

      SELECT t.id, -- omit once confirmed data is correct
             a.alias_id, -- omit once confirmed data is correct
             SUM(t.points) AS points 
        FROM AWARD t 
        JOIN ACHIEVER a ON a.award_id = t.id
    GROUP BY t.id, a.alias_id
    

    一旦你知道求和是正确的,更新 INSERT 语句:

    SET points = (SELECT SUM(t.points)
                    FROM AWARD t 
                    JOIN ACHIEVER a ON a.award_id = t.id
                   WHERE a.alias_id = 2000 --don't include if you don't need it
                GROUP BY t.id, a.alias_id)
    

    【讨论】:

    • 谢谢,但我不想仅限于 2000。我想为我所有的 1M 行执行此操作。这可能吗?
    • @Paul:如果不需要,请不要包含 WHERE 子句 - 请参阅我提到的关于首先调整 SELECT 语句的内容,但请注意 SELECT 和 UPDATE 语句之间的相关性。
    • 啊!秘诀是将内部选择与外部表连接起来。 UPDATE aliaspoint ap SET points = (SELECT SUM(t.points) FROM award t JOIN achiever a ON a.award_id = t.id WHERE a.alias_id = ap.alias_id GROUP BY a.alias_id);
    猜你喜欢
    • 2011-08-31
    • 1970-01-01
    • 2014-02-01
    • 2014-07-27
    • 2020-09-13
    • 1970-01-01
    • 1970-01-01
    • 2021-01-18
    • 2020-04-28
    相关资源
    最近更新 更多