За последние 24 часа нас посетили 17064 программиста и 1302 робота. Сейчас ищут 1911 программистов ...

Выборка суммы из двух таблиц

Тема в разделе "MySQL", создана пользователем Lazarius, 27 дек 2006.

  1. Lazarius

    Lazarius Активный пользователь

    С нами с:
    27 окт 2006
    Сообщения:
    37
    Симпатии:
    0
    Адрес:
    г. Москва
    Привет всем.
    Есть две таблицы
    t1 - id | name | sum
    t2 - name | sum2

    Нужно получить сумму сумм из двух таблиц для name.

    Если запрос
    Код (Text):
    1.  
    2. SELECT t1.name, SUM(sum+sum2) AS val FROM t1, t2 WHERE t1.name=t2.name GROUP BY t1.name, t2.name
    то сумма для t1 считается правильно, а для t2 сумма берется столько раз сколько записей name присутствует в t1.

    Проще говоря если в t1 есть две записи
    Код (Text):
    1.  
    2. 1 | nic | 10
    3. 2 | nic | 10
    а в t2
    Код (Text):
    1.  
    2. nic | 20
    то нужно получить значение 40 (10+10+20), а получаю значение 60 (10+10+20+20)

    Как получить нужное мне значение?
     
  2. DarkElf

    DarkElf Активный пользователь

    С нами с:
    22 окт 2006
    Сообщения:
    1.632
    Симпатии:
    0
    два запроса..
    или объедини таблицу, добавив в нее еще одно поле, указывающее, в какой из двух таблиц запись должна была быть..
     
  3. Lazarius

    Lazarius Активный пользователь

    С нами с:
    27 окт 2006
    Сообщения:
    37
    Симпатии:
    0
    Адрес:
    г. Москва
    Проблему решил так
    Код (Text):
    1.  
    2. SELECT name, SUM(sum) AS val
    3. FROM (
    4.   SELECT name, sum FROM t1 UNION ALL SELECT name, sum2 FROM t2
    5. ) AS u
    6. GROUP BY name ORDER BY val
    Но не работает на mysql 4.0, начиная с 4.1 работает.
     
  4. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    Возможно так будет быстрее чем UNION а возможно нет :) Как вариант...
    Код (Text):
    1. SELECT name,
    2.     (SUM(sum)+(SELECT SUM(t2.sum) FROM t2 WHERE t1.name = t2.name)) AS val
    3. GROUP BY name ORDER BY val