2012-05-22 3 views
2

Я хотел бы найти сумму столбца в одном запросе, полученном при объединении нескольких таблиц.Сумма баллов за несколько таблиц в MySQL

У меня есть таблица Деяний и таблица, в которой отображаются пользователи, выполняющие Activity, а также таблицу, отображающую команды для выполненных действий. Оба пользователя и команды могут выполнять одно и то же действие несколько раз.

Каждое действие стоит определенного количества очков, и я хотел бы узнать общее количество баллов для данного пользователя, объединив их действия с деятельностью своей команды.

Я пробовал различные комбинации соединений между тремя таблицами, но не могу выработать правильный запрос, чтобы суммировать очки для данного пользователя.

Следующая 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'); 
+0

что пользователь отношения и команды? Я думаю, что чего-то не хватает. не можете найти связь между 'team_action' и' user_action', чтобы получить сумму для пользователя. – Darshana

+0

Существуют таблицы для пользователя и команды, а у Пользователя есть внешний ключ для Команды. Для этого примера я не верю, что показать это отношение строго необходимо? По сути, меня интересует только то, как я могу правильно суммировать для набора строк user_action и rows_action. Имеет ли это смысл? Я могу расширить схему, если вы думаете, что это поможет. –

ответ

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

Спасибо, что работает нормально. Я намеренно пропустил это отношение для упрощения тестового примера, но вы предположения о внешних ключах в значительной степени верны. –

Смежные вопросы