MySQL中多个表的总和

时间:2012-05-22 04:49:48

标签: mysql sql aggregate-functions

我想在给定多个表之间的连接的单个查询中找到列的总和。

我有一个活动表,一个映射执行活动的用户的表,以及一个将团队映射到已执行活动的表。用户和团队都可以多次执行相同的活动。

每项活动都值得一定数量的积分,我想通过将他们的活动与团队的活动相加来了解给定用户的总积分数。

我已尝试过三种表之间的各种连接组合,但无法计算出正确的查询以总计给定用户的点数。

以下SQL将创建此设置的最小版本:

CREATE TABLE `activity` (
  `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(255) NOT NULL DEFAULT '',
  `points` INT(10) UNSIGNED NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=INNODB;

CREATE TABLE `team_action` (
  `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  `activity_id` INT(11) UNSIGNED NOT NULL,
  `date` DATETIME NOT NULL,
  PRIMARY KEY (`id`),
  CONSTRAINT `team_action_ibfk_1` FOREIGN KEY (`activity_id`) REFERENCES `activity` (`id`)
) ENGINE=INNODB;

CREATE TABLE `user_action` (
  `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  `activity_id` INT(11) UNSIGNED NOT NULL,
  `date` DATETIME NOT NULL,
  PRIMARY KEY (`id`),
  CONSTRAINT `user_action_ibfk_1` FOREIGN KEY (`activity_id`) REFERENCES `activity` (`id`)
) ENGINE=INNODB;

INSERT INTO `activity` (`id`, `name`, `points`)
VALUES (1,'Running',10), (2,'Swimming',20), (3,'Hiking',30), (4,'Cycling',40);

INSERT INTO `team_action` (`id`, `activity_id`, `date`)
VALUES (1,2,'2012-05-22 14:32:31'), (2,4,'2012-05-22 14:32:36');

INSERT INTO `user_action` (`id`, `activity_id`, `date`)
VALUES (1,1,'2012-05-22 14:32:08'), (2,1,'2012-05-22 14:32:18'), (3,3,'2012-05-22 14:32:23');

1 个答案:

答案 0 :(得分:1)

从表格定义中不清楚用户如何与团队相关(即对于用户,您如何知道哪个是“他们的”团队?)但我认为总结这些要点的关键是使用{{ 1}}关于子查询中SUM的结果。

有些事情:

UNION ALL