2011-02-09 21 views
8

OK, me duele la cabeza ...!MySQL: buscando SUMAR estos UNION juntos

Esta hermosa consulta 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) 

... devuelve tres filas de números bonitos.

Idealmente, me gustaría que esta consulta devuelva los tres resultados "twitfollow", SUMAR juntos.

Sin embargo, poniendo una ronda SUM me da un error acerca de "cada tabla derivada debe tener su propio alias", y estoy un poco confundido en cuanto a cómo resolverlo.

(Por supuesto, tan sólo pudiera resumir los resultados en PHP, pero estoy asumiendo que es más rápido para hacer esto utilizando el servidor MySQL ¿Sería correcto.?)

Respuesta

26

Use su consulta completa como la cláusula de FROM de otra consulta:

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 

que también cambió su UNION-UNION ALL que es probable que no desea eliminar filas sólo porque la suma de una tabla es igual a la suma de otra tabla.

+0

Aha. El "t1" parece hacer el truco. Muchas gracias, Dan. (The UNION ALL - sí, necesito ver qué devuelven las dos consultas.) – jamescridland

+1

Sí, tienes que dar la tabla derivada que estás seleccionando de un nombre, incluso si no usas el nombre ... eso es todo el 't1' es. –

0

Simplemente envuelva una consulta agregación alrededor de él:

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

Eso es lo que pensé. Sin embargo, eso devuelve '# 1248 - Cada tabla derivada debe tener su propio alias'. – jamescridland

0

Por qué no por lo que es más corto, como a continuación?

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