来自多个表的mysql计数(*)

Posted

技术标签:

【中文标题】来自多个表的mysql计数(*)【英文标题】:mysql count(*) from multiple tables 【发布时间】:2011-06-14 04:57:24 【问题描述】:

我有一个 mysql 数据库,其中包含我公司客户每天使用我们服务时的数据。

数据库中的每个表代表一个 24 小时期间以及在该期间发生的所有客户交易。

我想计算几天内的总交易量

到目前为止,我有一个执行以下操作的 select 语句

select 
  (
    select count(customer) from 2010Dec28 
    where customer='<customer name>'
  ) as t1,
  (
    select count(customer) from 2010Dec29 
    where customer='<customer name>'
  )as t2;`

但这会将结果作为两个单独的计数返回

| t1   | t2    |
| 1438 | 16282 |
1 row n set (0.00 sec)`

我的问题是如何生成这两个结果的总和,而不必在我的应用程序代码中这样做。

【问题讨论】:

我认为“数据库中的每个表都代表一个 24 小时周期”是您应该停止并重新考虑您的设计的地方。 听从人们给您的建议并修复您的设计。每个日期不应有单独的表格。您最多可能有一张用于实时数据的表和一张用于存档数据的表。日期是表中各行中的一列,而不是表的名称。然后按日期查询计数非常简单。如果在修复设计之前需要临时解决方案,请使用 UNION ALL 查询将多个查询合并为一个,然后将整个联合包装到另一个 SELECTSUM 的所有计数中。 每天每张桌子都是我见过的最糟糕的主意,效率低下,无法维护 哇,好吧,我肯定会重新设计我这样做的方式,在我的辩护中,我是一名网络工程师,我在业余时间一直在拼凑这些,以从各种日志文件中获取一些统计数据 【参考方案1】:

Tyler 可能是对的,设计肯定是错的!

但这是可能的..

select 
    sum(a.count)
from
    (select count(*) as count from table1
     union all
     select count(*) as count from table2) a

【讨论】:

感谢您的建议,但这给了我一个错误,例如 ERROR 1248 (42000): 每个派生表都必须有自己的别名 好的,这因 rdbms 而异,我对 mysql 不太熟悉,我已经编辑添加了别名。 好的,这适用于mysql,感谢您的帮助,这将在我再次设计数据库时在短期内使用。【参考方案2】:

修复您的数据库设计。除非您要对 数十亿 行进行某种海量数据仓库,否则每天一张单独的表是非常不合适的。

【讨论】:

【参考方案3】:

只需将交叉连接换成直接子 + 子,如下所示。比建立任何联合或联接要容易得多

select 
  (
    select count(customer) from 2010Dec28 
    where customer='<customer name>'
  ) + (
    select count(customer) from 2010Dec29 
    where customer='<customer name>'
  )

【讨论】:

以上是关于来自多个表的mysql计数(*)的主要内容,如果未能解决你的问题,请参考以下文章

SQL 2012 将来自多个表的多个查询与连接和计数合并到一个表中

SQLPlus - 跨多个表的计数函数

SQL:使用来自两个不同表的计数

左连接计数来自第二个表的三个属性

对多个表的计数/分组应用聚合函数

维度建模中事实表的两个或多个相似计数