2010-03-05 5 views

Répondre

40
select id, sum(amount) from (
    select id,amount from table_1 union all 
    select id,amount from table_2 union all 
    select id,amount from table_3 
) x group by id 
+1

Je suis à la recherche d'un moyen d'accomplir cela dans une vue, mais les sous-requêtes ne sont pas autorisées dans les vues. Y a-t-il une alternative? –

+1

rendre la sous-requête une autre vue – Jimmy

9
SELECT id, SUM(amount) FROM 
(
    SELECT id, SUM(amount) AS `amount` FROM t1 GROUP BY id 
    UNION ALL 
    SELECT id, SUM(amount) AS `amount` FROM t2 GROUP BY id 
) `x` 
GROUP BY `id` 

J'ai grouté chaque table et unioned parce que je pense que ce pourrait être plus rapide, mais vous devriez essayer les deux solutions.

2

sous-requête:

SELECT id, SUM(amount) 
FROM (SELECT * FROM t1 
     UNION ALL SELECT * FROM t2 
     UNION ALL SELECT * FROM t3 
    ) 
GROUP BY id 
+0

Remarque: vous ne devez pas utiliser select * dans ce cas. –

+0

Note 2: Je parie que mysql vous demandera d'assigner un alias à la sous-requête – zerkms

+0

@David: Pour sûr, mon mauvais. Probablement pas d'importance si id et le montant sont les deux seules colonnes, mais quelles sont les chances de cela? @zerkms: Aussi vrai. – adharris

0

Je ne sais pas si MySQL utilise l'expression de table commune, mais je referais ce dans Postgres:

WITH total AS(
       SELECT id,amount AS amount FROM table_1 UNION ALL 
       SELECT id,amount AS amount FROM table_2 UNION ALL 
       SELECT id,amount AS amount FROM table_3 
      ) 
SELECT id, sum(amount) 
    FROM total 

Je pense que cela devrait faire l'affaire aussi bien.

Questions connexes