MySQL: ищем СУММЫ вместе - PullRequest
       6

MySQL: ищем СУММЫ вместе

9 голосов
/ 09 февраля 2011

ОК, у меня болит голова ...!

Этот красивый запрос MySQL:

(SELECT mtwitterfollowers AS twitfollow FROM `media` WHERE media.id=1)
UNION
(SELECT SUM(twitterfollowers) AS twitfollow FROM people LEFT JOIN peoplejoin ON peoplejoin.people_id = people.id LEFT JOIN positions ON position_id = positions.id WHERE peoplejoin.media_id = 1)
UNION 
(SELECT SUM(twitterfollowers) AS twitfollow FROM people LEFT JOIN peoplejoin ON peoplejoin.people_id = people.id LEFT JOIN networkjoin ON networkjoin.network_id = peoplejoin.network_id LEFT JOIN positions ON position_id = positions.id WHERE networkjoin.media_id = 1)

... возвращает три строки красивых чисел.

В идеале,Я бы хотел, чтобы этот запрос возвращал все три результата "twitfollow", SUMmed вместе.

Однако, если поместить их в SUM, я получаю сообщение об ошибке "каждая производная таблица должна иметь свой собственный псевдоним", и я 'Я немного сбит с толку относительно того, как это решить.

(Конечно, я мог бы просто суммировать результаты в PHP; но я предполагаю, что это быстрее сделать, используя сервер MySQL. Буду ли яверно?)

Ответы [ 3 ]

28 голосов
/ 09 февраля 2011

Используйте весь ваш запрос в качестве предложения FROM другого запроса:

SELECT SUM(twitfollow) FROM (
    (SELECT mtwitterfollowers AS twitfollow FROM `media` WHERE media.id=1)
    UNION ALL
    (SELECT SUM(twitterfollowers) AS twitfollow FROM people LEFT JOIN peoplejoin ON peoplejoin.people_id = people.id LEFT JOIN positions ON position_id = positions.id WHERE peoplejoin.media_id = 1)
    UNION ALL
    (SELECT SUM(twitterfollowers) AS twitfollow FROM people LEFT JOIN peoplejoin ON peoplejoin.people_id = people.id LEFT JOIN networkjoin ON networkjoin.network_id = peoplejoin.network_id LEFT JOIN positions ON position_id = positions.id WHERE networkjoin.media_id = 1)
) t1

Я также изменил ваш UNION на UNION ALL, поскольку вы, вероятно, не хотите удалять строки только потому, что сумма из одной таблицы равна сумме из другой таблицы.

0 голосов
/ 27 апреля 2015

Почему бы не сделать его короче, как показано ниже?

SELECT SUM(
    (SELECT mtwitterfollowers AS twitfollow FROM `media` WHERE media.id=1)
    +
    (SELECT SUM(twitterfollowers) AS twitfollow FROM people LEFT JOIN peoplejoin ON peoplejoin.people_id = people.id LEFT JOIN positions ON position_id = positions.id WHERE peoplejoin.media_id = 1)
    +
    (SELECT SUM(twitterfollowers) AS twitfollow FROM people LEFT JOIN peoplejoin ON peoplejoin.people_id = people.id LEFT JOIN networkjoin ON networkjoin.network_id = peoplejoin.network_id LEFT JOIN positions ON position_id = positions.id WHERE networkjoin.media_id = 1)
) AS twitterfollowers
0 голосов
/ 09 февраля 2011

Просто оберните агрегирующий запрос вокруг него:

SELECT SUM(twitfollow)
FROM
(
    (SELECT mtwitterfollowers AS twitfollow FROM `media` WHERE media.id=1)
    UNION ALL
    (SELECT SUM(twitterfollowers) AS twitfollow FROM people LEFT JOIN peoplejoin ON peoplejoin.people_id = people.id LEFT JOIN positions ON position_id = positions.id WHERE peoplejoin.media_id = 1)
    UNION ALL
    (SELECT SUM(twitterfollowers) AS twitfollow FROM people LEFT JOIN peoplejoin ON peoplejoin.people_id = people.id LEFT JOIN networkjoin ON networkjoin.network_id = peoplejoin.network_id LEFT JOIN positions ON position_id = positions.id WHERE networkjoin.media_id = 1)
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...