mysql - 如何获取多个表的项目计数

标签 mysql sql count

我有多个表(每天一个)都具有相同的结构:ID、srcIP、时间。

我可以使用以下方法获取每天的总行数:

SELECT
  (SELECT COUNT(*) FROM Day1) as Day1Count, 
  (SELECT COUNT(*) FROM Day2) as Day2Count,
  (SELECT COUNT(*) FROM Day3) as Day3Count

但这只是给了我

Day1count  Day1count Day1count
102        148       131

但是我怎样才能得到每个 IP 地址每天的总数呢?并非所有 IP 每天都存在。

srcIP       D1  D2  D3
172.16.0.1      99  34
172.16.0.2  55      22
172.16.0.3  47  49  75

提前致谢!

最佳答案

要按 ip 和按天获取计数,最简单的方法是展平查询:

SELECT 'day1' AS day, srcIP, count(*) AS count FROM Day1 GROUP BY srcIP
UNION
SELECT 'day2' AS day, srcIP, count(*) AS count FROM Day2 GROUP BY srcIP
UNION
SELECT 'day3' AS day, srcIP, count(*) AS count FROM Day3 GROUP BY srcIP

然后在您的应用中转置它以获得您想要的表格格式。

或者

您也可以通过加入 IP 来完成:

SELECT srcIP, d1.count, d2.count, d3.count
FROM (SELECT srcIP, count(*) AS count FROM Day1 GROUP BY srcIP) d1
LEFT JOIN (SELECT srcIP, count(*) AS count FROM Day2 GROUP BY srcIP) d2 USING (srcIP)
LEFT JOIN (SELECT srcIP, count(*) AS count FROM Day3 GROUP BY srcIP) d3 USING (srcIP)

但是在这里您将丢失不在 Day1 中的 IP,除非您首先从所有天的 UNION 中执行 SELECT DISTINCT srcIP,这非常昂贵。基本上,这种表结构不太适合这种聚合。

关于mysql - 如何获取多个表的项目计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4400347/

相关文章:

sql - 删除除最近的 1 行以外的所有行

php - 计算从数组插入到 mysql 数据库中的总项目数

c++ - 计算树中的所有节点

excel - CountifS + 多个条件 + 非重复计数

c# - 需要使用Seed方法向映射表添加数据吗?

java - 将图像 blob 插入 MySQL - NullPointerException

php - 将某些表列导入到数据库表中

选择查询和 'order by' 子句的 MySQL 问题

android - sqlite 表中始终返回 null 值

sql - 从组中选择满足条件 A 的行。如果不满足,请给我满足条件 B 的行