2011-02-09 4 views
8

OK、私の頭が痛い...!MySQL:これらのUNIONをまとめてSUMを探す

この美しい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) 

は...かなりの数の3行を返します。

理想的には、私は3つの "twitfollow"の結果をすべて返すようにしたいと思います。

しかし、SUMを丸めると、「すべての派生テーブルには別のエイリアスが必要です」というエラーが表示されます。これを解決するにはかなり混乱します。

(もちろん、私はPHPで結果をまとめることができ、私はそれはMySQLサーバを使用してこれを行うには迅速だと仮定しています、私は右のだろう。?)

答えて

26

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 ALLにごUNIONを変更しました。

+0

Aha。 "t1"はトリックをするようです。多くのありがとう、ダン。 (UNION ALL - はい、2つのクエリが返すものを調べる必要があります) – jamescridland

+1

名前を使用しなくても、派生テーブルを名前から選択する必要があります。すべての 't1'はです。 –

0

ちょうどそれの周りに集計クエリラップ:なぜ以下のように、それは短くなっていない

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

それは私が思ったものです。しかし、それは '#1248 - すべての派生テーブルはそれ自身のエイリアスを持たなければなりません'を返します。 – jamescridland

0

を?

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