2011-02-09 26 views
8

OK, đầu tôi đau ...!MySQL: tìm cách SUM các UNION này cùng nhau

này truy vấn MySQL đẹp:

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

... trả về ba dãy số đẹp.

Lý tưởng nhất, tôi muốn truy vấn này trả lại tất cả ba kết quả "twitfollow", Tóm tắt lại với nhau.

Tuy nhiên, đặt vòng SUM cho chúng tôi lỗi "mọi bảng dẫn xuất phải có bí danh riêng" và tôi hơi bối rối về cách giải quyết điều đó.

(Tất nhiên, tôi chỉ có thể tóm tắt các kết quả trong PHP; nhưng tôi giả định rằng nó nhanh hơn để làm điều này bằng cách sử dụng máy chủ MySQL Tôi có thể đúng.?)

Trả lời

26

Sử dụng toàn bộ truy vấn của bạn như mệnh đề FROM truy vấn khác:

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 

tôi cũng thay đổi UNION của bạn để UNION ALL như thể bạn không muốn loại bỏ hàng chỉ vì số tiền từ một bảng là bằng tổng từ bảng khác.

+0

Aha. Các "t1" dường như làm các trick. Rất cám ơn, Dan. (UNION ALL - vâng, tôi cần xem xét hai câu trả lời là gì.) – jamescridland

+1

Vâng, bạn phải cung cấp cho bảng dẫn xuất bạn đang chọn từ một tên, ngay cả khi bạn không sử dụng tên ... đó là tất cả 't1' là. –

0

Chỉ cần quấn một truy vấn tập hợp xung quanh nó:

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

Đó là những gì tôi nghĩ. Tuy nhiên, điều đó trả về '# 1248 - Mỗi bảng dẫn xuất phải có bí danh riêng của nó'. – jamescridland

0

Tại sao không làm cho nó ngắn hơn, như dưới đây?

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