来自多个表的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
查询将多个查询合并为一个,然后将整个联合包装到另一个 SELECT
到 SUM
的所有计数中。
每天每张桌子都是我见过的最糟糕的主意,效率低下,无法维护
哇,好吧,我肯定会重新设计我这样做的方式,在我的辩护中,我是一名网络工程师,我在业余时间一直在拼凑这些,以从各种日志文件中获取一些统计数据
【参考方案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计数(*)的主要内容,如果未能解决你的问题,请参考以下文章