web-dev-qa-db-fra.com

un moyen simple de résumer le résultat de UNION dans MySql

J'ai une union de trois tables (t1, t2, t3). Chaque réexécute exactement le même nombre d'enregistrements, la première colonne est id, la deuxième quantité: 

1  10
2  20
3  20

1  30
2  30
3  10

1  20
2  40
3  50

Existe-t-il un moyen simple en SQL de le résumer pour obtenir uniquement

1   60
2   80
3   80
21
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
47
Jimmy
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 regroupé chaque table et je me suis uni parce que je pense que cela pourrait être plus rapide, mais vous devriez essayer les deux solutions.

10
zerkms

Sous-requête:

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

Je ne sais pas si MySQL utilise une expression de table commune, mais je le ferais 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.

0
just_myles