首页 > 解决方案 > 选择所有数据库中列的总和

问题描述

我想查看我所有数据库中的订单总和,以获得一些见解。现在我有一个正确列出 database_name 和 table 的查询。

SELECT table_schema AS database_name, table_name
FROM information_schema.tables
WHERE table_name =  "shopping_carts";

我想要的是某种查询,我会在其中做这样的事情。

SELECT table_schema as database_name, SUM(shopping_carts.sub_total)........

如何查询这样的事情?

编辑:我想看到的是:

l database_name l SUM(column_name) l

| database_name1 |   114728   | ##sum of database_name1.shopping_carts.column_name
| database_name2 |   252154   | ##sum of database_name2.shopping_carts.column_name
| database_name4 |    48156   | ## etc.
| database_name5 |    18448   | ## etc.

标签: mysql

解决方案


我建议您使用单个表shopping_charts,在其中添加一个名为的列,例如database_name. 这将使查询更容易编写和维护,并得到适当的优化。

虽然不是最优的,但您可以使用动态查询来解决您的问题,例如,此查询将返回您必须在每个数据库上执行的选择列表:

select
  concat(
    'select ''', table_schema, ''' AS database_name,'
    'sum(sub_total)',
    ' from ', table_schema, '.shopping_charts'
  )
from
  information_schema.tables
where
  table_name = "shopping_carts"

那么您可以使用 group_concat 来获取单个 sql 语句:

select group_concat(sql_single_db separator ' union all ') as sql_all_db
from (
  select
    concat(
      'select ''', table_schema, ''' AS database_name,'
      'sum(sub_total)',
      ' from ', table_schema, '.shopping_charts'
    ) sql_single_db
  from
    information_schema.tables
  where
    table_name = "shopping_charts"
) s into @sql_all_db;

您可以使用以下命令执行:

prepare stmt1 from @sql_all_db;
execute stmt1;
deallocate prepare stmt1;

推荐阅读