13 Stimmen

MySQL: Suche nach SUMME für diese UNIONs

OK, mein Kopf tut weh...!

Diese schöne MySQL-Abfrage:

(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)

...gibt drei Zeilen mit hübschen Zahlen zurück.

Im Idealfall möchte ich, dass diese Abfrage alle drei "twitfollow"-Ergebnisse zurückgibt, summiert.

Allerdings, eine SUMME um sie herum gibt mir einen Fehler über "jede abgeleitete Tabelle muss seinen eigenen Alias haben", und ich bin ein wenig verwirrt, wie ganz zu tun, dass zu lösen.

(Natürlich könnte ich die Ergebnisse auch einfach in PHP summieren, aber ich gehe davon aus, dass es schneller geht, wenn ich den MySQL-Server verwende. Liege ich da richtig?)

42voto

Dan Grossman Punkte 50597

Verwenden Sie Ihre gesamte Abfrage als FROM Klausel einer anderen Abfrage:

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

Ich habe auch Ihre UNION a UNION ALL da Sie wahrscheinlich keine Zeilen entfernen wollen, nur weil die Summe aus einer Tabelle gleich der Summe aus einer anderen Tabelle ist.

1voto

Juvy Cagape Punkte 49

Warum nicht kürzer, wie unten?

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

0voto

marapet Punkte 52074

Wickeln Sie einfach eine aggregierende Abfrage um sie herum:

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)
)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X