2009-09-26 83 views
0

我想做一个SUM并将其存储在另一个表中。 SUM很简单:MySQL:与SUM和JOIN更新

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 | 

回答

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) 
+0

如何在我的更新中使用它? – 2009-09-26 20:53:23

+0

谢谢,但我不想只限于2000年。我想为我所有的1M行做到这一点。那可能吗? – 2009-09-26 21:44:22

+0

@Paul:如果您不需要它,请不要包含WHERE子句 - 请参阅我提到的有关优化SELECT语句的提示,但请注意SELECT和UPDATE语句之间的相关性。 – 2009-09-26 22:00:09