2

複数のテーブル間の結合を指定して、単一のクエリで列の合計を見つけたいと思います。

アクティビティのテーブル、アクティビティを実行するユーザーをマップするテーブル、チームを実行されたアクティビティにマップするテーブルがあります。ユーザーとチームの両方が同じアクティビティを複数回実行できます。

各アクティビティは一定のポイント数に値します。特定のユーザーのアクティビティとチームのアクティビティを合計して、そのユーザーの合計ポイント数を知りたいです。

3 つのテーブル間で結合のさまざまな組み合わせを試しましたが、特定のユーザーのポイントを合計するための正しいクエリを実行できません。

次の 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');
4

1 に答える 1

1

SUMユーザーがチームにどのように関連しているかは、表の定義からは明らかではありません (つまり、ユーザーにとって、どのチームが「自分の」チームであるかをどのように知ることUNION ALLができますか?)。サブクエリ。

次のようなもの:

SELECT SUM(points) AS total
FROM
(SELECT points
 FROM team_action JOIN activity ON(activity.id = team_action.activity_id)
 WHERE team_action.id = my_team
 UNION ALL
 SELECT points
 FROM user_action JOIN activity ON(activity.id = user_action.activity_id)
 WHERE user_action.id = my_user) me_and_team
于 2012-05-22T05:38:04.007 に答える