[MySQL] Подсчет в 2-х таблицах

LEXAlForpostl

Мой дом здесь!
Регистрация
21 Май 2008
Сообщения
766
Реакции
228
Здравствуйте.
Имеются 2 таблички.
T1:
id | name1 | name2 | q | ...|

1 | a | b | 4
2 | a | c | 2
3 | z | b | 8
4 | a | b | 1

...
T2:
id | name1 | name2 | q |...|

1 | a | b | 1
2 | z | b | 2

....
Причем t2.name1 и t2.name2 - входят во множество t1.name1, t1.name2 соответственно.
Необходимо получить данные вида:
NAME1 | NAME2 | t1.sum(q) | t2.sum(q)
a | b | 5 | 1
a | c | 2 | NULL
z | b | 8 | 2

Заранее спасибо за помощь.
 
  • Заблокирован
  • #2
либо очень просто либо в чем подвох
select t1.*, t2.*, (select sum(t1.q) from t1) as t1sumq, (select sum(t2) from t2) as t2sumq
from t1, t2

вроде как то так
 
Если допускается возможность, что в таблице t1 содержатся такие значения name1 и name2, которых нет в t2 (или наоборот), то в MySQL с помощью одного запроса этого не сделать.
Только с помощью хранимой процедуры, так как MySQL не поддерживает FULL JOIN.
В Microsoft SQL это должно быть так:
SELECT name1, name2, sum(t1.q), sum(t2.q) FROM t1 FULL JOIN t2 ON t1.name1 = t2.name1 AND t1.name2 = t2.name2 GROUP BY name1, name2

Если же в таблицах t1 и t2 обязательно присутствуют одинаковые name1 и name2, то запрос такой:
SELECT t1.name1, t1.name2, sum(t1.q), sum(t2.q) FROM t1, t2 WHERE t1.name1 = t2.name1 AND t1.name2 = t2.name2 GROUP BY t1.name1, t1.name2
 
Последнее редактирование:
Если допускается возможность, что в таблице t1 содержатся такие значения name1 и name2, которых нет в t2 (или наоборот), то в MySQL с помощью одного запроса этого не сделать.
Именно такой случай. Когда во 2й таблице может быть лишь часть имен из 1й.
 
Если нет записей где name1 или name2 is null, то можно воспользоваться вот такой конструкцией. Правда, работать она будет не быстро.
/* Выбираем суммы для тех записей, у которых совпадают name1 и name2 в таблицах t1 и t2. */
SELECT t1.name1, t1.name2, sum(t1.q), sum(t2.q) FROM t1, t2 WHERE t1.name1 = t2.name1 AND t1.name2 = t2.name2 GROUP BY t1.name1, t1.name2
/* Добавляем суммы для тех записей, которые присутствуют только в t1 и нет в t2. */
UNION
SELECT t1.name1, t1.name2, sum(t1.q), 0 FROM t1 WHERE NOT EXISTS (SELECT 1 FROM t2 WHERE t1.name1 = t2.name1 AND t1.name2 = t2.name2) GROUP BY t1.name1, t1.name2
/* Добавляем суммы для тех записей, которые присутствуют только в t2 и нет в t1. */
UNION
SELECT t2.name1, t2.name2, 0, sum(t2.q) FROM t2 WHERE NOT EXISTS (SELECT 1 FROM t1 WHERE t1.name1 = t2.name1 AND t1.name2 = t2.name2) GROUP BY t2.name1, t2.name2
 
Назад
Сверху