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

Тема в разделе "Базы данных", создана пользователем LEXAlForpostl, 21 ноя 2017.

Модераторы: latteo
  1. LEXAlForpostl

    LEXAlForpostl

    Регистр.:
    21 май 2008
    Сообщения:
    750
    Симпатии:
    227
    Здравствуйте.
    Имеются 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. lemurs

    lemurs Постоялец

    Регистр.:
    8 ноя 2015
    Сообщения:
    77
    Симпатии:
    18
    либо очень просто либо в чем подвох
    select t1.*, t2.*, (select sum(t1.q) from t1) as t1sumq, (select sum(t2) from t2) as t2sumq
    from t1, t2

    вроде как то так
     
  3. Роман Дмитриев

    Роман Дмитриев Создатель

    Регистр.:
    16 авг 2015
    Сообщения:
    22
    Симпатии:
    3
    Если допускается возможность, что в таблице 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
     
    Последнее редактирование: 26 ноя 2017
  4. LEXAlForpostl

    LEXAlForpostl

    Регистр.:
    21 май 2008
    Сообщения:
    750
    Симпатии:
    227
    Именно такой случай. Когда во 2й таблице может быть лишь часть имен из 1й.
     
  5. Роман Дмитриев

    Роман Дмитриев Создатель

    Регистр.:
    16 авг 2015
    Сообщения:
    22
    Симпатии:
    3
    Если нет записей где 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