2014-08-26 7 views
0

У меня есть 3 таблицы:MYSQL - Выберите общую сумму 3 присоединился к таблице

таблица а => идентификатор, имя

Таблица B => идентификатор, id_a, количество

таблица с => идентификатор , id_a, amount

Как выбрать таблицу a и общую сумму из таблицы b и таблицы c?

Я уже пробовал:

SELECT a.`name`, SUM(b.`amount`) AS Total 
FROM a 
LEFT JOIN b ON a.`id` = b.`id_a` 
UNION 
SELECT a.`name`, SUM(c.`amount`) AS Total 
FROM a 
RIGHT JOIN c ON a.`id` = c.`id_a` 
GROUP BY a.`id` 

Но он показывает несколько записей из таблицы а где есть id_a значение как в таблице б и таблицы с.

FYI: если таблица a вставлена, то в таблицу b или таблицу c или обе таблицы b и таблицу c будут вставлены детали. Таким образом, нет никакой возможности таблицы а имеет ни одна деталь в таблице А или б

Вот пример данных

стол: с

id | name 
1 | name 1 
2 | name 2 

стол б:

id | id_a | amount 
1 | 1 | 300 
2 | 1 | 200 

таблица c:

id | id_a | amount 
1 | 1 | 200 
2 | 1 | 100 
3 | 2 | 300 
4 | 2 | 100 

Предпочтительной Результат:

name | amount 
name 1 | 800 
name 2 | 400 

ОБНОВЛЕНИЕ Ответом => Благодаря @Jens

SELECT d.NAME, SUM(d.Total) FROM (
SELECT a.id AS id , a.`name` AS NAME, SUM(b.`amount`) AS Total 
FROM a 
LEFT JOIN b ON a.`id` = b.`id_a` 
GROUP BY a.`id` 
UNION 
SELECT a.`id` AS id, a.`name`, SUM(c.`amount`) AS Total 
FROM a 
RIGHT JOIN c ON a.`id` = c.`id_a` 
GROUP BY a.`id` 
) AS d 
GROUP BY d.`id` 

Другой ответ ОТ @Alex работает ТОО и проще Благодаря как для @Jens, так и для @Alex. Это меняю мои знания

+1

вы 'группа by' работает только на последнем выберите .. – thebjorn

+0

если я удалить его, он только получить первую запись таблицы А и общую сумму. Таким образом, он извлекает только 1 запись. Если я поместил его в оба запроса, он отобразит избыточную запись таблицы a, но с разным общим количеством таблицы b и таблицы c –

+1

Каков ваш предпочтительный результат? можете ли вы объяснить дальше? – Edrich

ответ

0

Вы это пробовали?

SELECT a.name, sum(b.amount), sum(c.amount) 
FROM a 
JOIN b on a.id = b.id_a 
JOIN c on a.id = c.id_a 
GROUP BY a.id 

не уверен в отношениях, но вы можете заменить РЕГИСТРИРУЙТЕСЬ с LEFT JOIN, если это ваш случай.

UPDATE

Это должно работать:

SELECT a.name as "name", sum(d.amount) as "amount" 
FROM a 
JOIN (SELECT id_a, amount FROM b UNION ALL SELECT id_a, amount FROM c) as d 
on d.id_a = a.id 
group by a.name 

Это дает следующие результаты:

name1 | 800 
name2 | 400 
+0

он извлекает 2 строки (что я предпочитаю), но общая сумма неправильная –

+0

@SteakMalang Я обновил ответ, не могли бы вы попробовать его сейчас? Хотя я только что видел, что это MySQL, и я сделал это в MSSQL. –

+1

Ничего себе, это сработало и проще. Спасибо –

1

Try

select d.name, sum(d.total) from (
SELECT a.id as id , a.`name` as name, b.`amount` AS Total 
FROM a 
LEFT JOIN b ON a.`id` = b.`id_a` 
UNION 
SELECT a.id as id a.`name`, c.`amount` AS Total 
FROM a 
RIGHT JOIN c ON a.`id` = c.`id_a` 
) as d 
GROUP BY d.`id` 

ОБНОВЛЕНО:

SELECT d.NAME, SUM(d.Total) FROM (
SELECT a.id AS id , a.`name` AS NAME, SUM(b.`amount`) AS Total 
FROM a 
LEFT JOIN b ON a.`id` = b.`id_a` 
GROUP BY a.`id` 
UNION 
SELECT a.`id` AS id, a.`name`, SUM(c.`amount`) AS Total 
FROM a 
RIGHT JOIN c ON a.`id` = c.`id_a` 
GROUP BY a.`id` 
) AS d 
GROUP BY d.`id` 
+0

@thebjorn Да. Я обновил свой ответ. Спасибо за подсказку. – Jens

+0

Посмотрите мой предпочтительный результат в моем вопросе. я просто попробую ваш запрос, и результат для имени 2 правильный (400), но имя 1 общая сумма - 600. Это должно быть 800 –

+0

@SteakMalang Можете ли вы проверить, какие записи вы получаете в обоих подзапросах для имени 1? – Jens

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