За последние 24 часа нас посетил 17541 программист и 1620 роботов. Сейчас ищут 1803 программиста ...

Суммирование по столбцам нескольких таблиц

Тема в разделе "MySQL", создана пользователем hyperint, 2 май 2008.

  1. hyperint

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

    С нами с:
    19 окт 2007
    Сообщения:
    32
    Симпатии:
    0
    Помогите, пожалуйста, составить запрос.

    Дано:

    table_1 (name/e_count/price):

    vasya 2 12
    vasya 1 1
    fedya 4 4
    petya 1 10

    table_2 (name/e_count/price):

    vasya 1 2
    fedya 3 1
    misha 1 3
    misha 1 1

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

    нужно получить таблицу со следующими столбцами: имя/сумма e_count из всех таблиц/сумма price из всех таблиц, т.е.:

    vasya 4 15
    fedya 7 5
    petya 1 10
    misha 2 4

    как должен выглядеть запрос? не могу сообразить.
     
  2. hyperint

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

    С нами с:
    19 окт 2007
    Сообщения:
    32
    Симпатии:
    0
    пробовал так:

    SELECT `name` , (SUM( `table_1`.`price` ) + SUM( `table_2`.`price` )) AS agr_price, (SUM( `table_1`.`e_count` ) + SUM( `table_2`.`e_count` )) AS agr_count
    FROM `table_1`, `table_2`
    WHERE (`table_1`.`name` = `table_2`.`name`)
    GROUP BY (`table_1`.`name`, `table_2`.`name`)

    ругается: Invalid use of group function

    что делать?
     
  3. Goryn

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

    С нами с:
    4 апр 2006
    Сообщения:
    398
    Симпатии:
    0
    Адрес:
    Ярославль
     
  4. hyperint

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

    С нами с:
    19 окт 2007
    Сообщения:
    32
    Симпатии:
    0
    Интересно, а чем же по Вашему "мы" занимаемся? Как раз-таки учим. А когда сталкиваемся с конкретными проблемами, которые самим решить пока не по силам, просим совета у опытных людей.

    Мой вопрос предполагал чуть более подробный и конкретный ответ. Если я лезу с вопросом (пусть даже простым) на форум, это не значит, что я не пробовал разобраться в проблеме сам или не искал соответствующую документацию. Искал, читал, пробовал так и эдак. Не получается! А для опытного программиста БД, работающего с MySQL, ответить на мой вопрос - минутное дело. Или что, руки отвалятся? Я ведь не прошу написать за меня программу или "разжевать" причины ошибки. Я прошу пример грамотно составленного запроса, глядя на который можно понять а) причину ошибки, б) методику решения задач такого типа.

    Я конечно понимаю, что для некоторых груз накопленных знаний и опыта слишком тяжел, чтобы просто сказать: "попробуй так ...", "об этом написано там-то" или хотя бы просто промолчать. Понятное дело, трудно не сумничать, когда такой умный, а конкретный ответ давать лениво. Иначе как же дать понять ламеру и остальным форумчанам, какой ты на самом деле умный?.. "Читай мануал, <дальше исчерпывающая характеристика задавшего вопрос>!" - звучит ведь очень солидно, не правда ли? Как тут удержаться?

    И все-таки я бы попросил любителей отвечать лаконичным "RTFM" взять себя в руки и не захламлять тему умствованиями, суть которых: "такие э-л-е-м-е-н-т-а-р-н-ы-е вопросы могут задавать только совсем уж непроходимые тупицы и лентяи". Если лениво отвечать конкретно - лучше помолчите. Вспомните, что когда-то сами были новичками.
     
  5. Goryn

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

    С нами с:
    4 апр 2006
    Сообщения:
    398
    Симпатии:
    0
    Адрес:
    Ярославль
    Ok, начнем с начала и разжевывания
    SELECT `name`
    name из какой таблицы?
     
  6. hyperint

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

    С нами с:
    19 окт 2007
    Сообщения:
    32
    Симпатии:
    0
    Эээ... сознаюсь, маленько соврал. Приведенный запрос - один из многих, которые пытался "сваять", но которые так не дали нужных мне результатов. К тому же я еще и немного упростил суть задачи. Дело в том, что таблицах table_1, table_2 нет как таковых имен пользователей. Вместо "вась" и "федь" там стоят id пользователей, а имена приведены в третьей таблице users, структура которой: (id|username). Так что в изначальном запросе было что-то такое:

    SELECT `users`.`username` , (SUM( `table_1`.`price` ) + SUM( `table_2`.`price` )) AS agr_price, (SUM( `table_1`.`e_count` ) + SUM( `table_2`.`e_count` )) AS agr_count
    FROM `table_1`, `table_2`, `users`
    WHERE (`table_1`.`user_id` = `users`.`id` || `table_2`.`name` = `users`.`id`)
    GROUP BY (`table_1`.`name`, `table_2`.`name`)
     
  7. hyperint

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

    С нами с:
    19 окт 2007
    Сообщения:
    32
    Симпатии:
    0
    Все, разобрался (не без посторонней помощи =) ). Решить задачу удалось двумя способами: при помощи связки UNION + вложенный запрос, а так же вложенного запроса с JOIN-ом. Если интересно, могу выложить.