У меня есть три таблицы: tableA (id, A), tableB (id, B) и tableC (id, C). id - уникальный и первичный ключ. Теперь я хочу запустить запрос в этих трех таблицах, чтобы узнать сумму значений A, B и C для каждого id. (то есть, если id1 присутствует в таблице A, но не в таблице B, тогда значение B должно считаться 0 для id 1). Например: tableA:
id A
1 5
2 6
3 2
5 7
TableB:
id B
2 5
3 8
4 1
tableC:
id C
5 2
вывод должен быть:
id Sum
1 (5 + 0 + 0 =)5
2 (6 + 5 + 0 =)11
3 (2 + 8 + 0 =)10
4 (0 + 1 + 0 =)1
5 (7 + 0 + 2 =)9
Сначала получите отдельный список (UNION) идентификаторов, чтобы вы включили все, а затем LEFT JOIN, чтобы добавить значения вместе.
Что-то вроде
SELECT IDs.ID,
IFNULL(tableA.A,0) + IFNULL(tableB.B,0) + IFNULL(tableC.C,0) SumVal
FROM (
SELECT ID
FROM tableA
UNION
SELECT ID
FROM tableB
UNION
SELECT ID
FROM tableC
) IDs LEFT JOIN
tableA ON IDs.ID = tableA.ID LEFT JOIN
tableB ON IDs.ID = tableB.ID LEFT JOIN
tableC ON IDs.ID = tableC.ID
Не уверен в точном синтаксисе MySQL, но это работает в SQL Server:
SELECT ID, SUM(ColToSum) As SumValue FROM
(
SELECT ID, A As ColToSum FROM TableA
UNION ALL
SELECT ID, B As ColToSum FROM TableB
UNION ALL
SELECT ID, C As ColToSum FROM TableC
) Combined
GROUP BY ID
Не забудьте использовать "UNION ALL", а не просто "UNION", который удаляет повторяющиеся строки по мере их объединения (см. http://dev.mysql.com/doc/refman/5.0/en/union.html)
Я не смог проверить его с помощью MySql, но это работает с моими базами данных (HSQLDB, Oracle):
select ID, sum(X) from
(SELECT ID, A as X FROM tableA
UNION
SELECT ID, B as X FROM tableB
UNION
SELECT ID, C as X FROM tableC)
group by ID
Что-то вроде этого должно работать:
select id, sum(val) from
( select id, "A" as val from "tableA"
union all
select id, "B" as val from "tableB"
union all
select id, "C" as val from "tableC" ) as joined
group by id
order by id