我有一个有570000条记录的大表,我只选择其中的一小部分作为示例。
例如,table1类似于:
+---------------------+---------------+
| StartTime | dIPaddr |
+---------------------+---------------+
| 2014-04-09 09:47:53 | 0.210.208.240 |
| 2014-04-09 09:47:53 | 0.210.208.240 |
| 2014-04-09 09:47:55 | 0.210.208.240 |
| 2014-04-09 08:39:55 | 0.210.243.93 |
| 2014-04-09 08:39:57 | 0.210.243.93 |
| 2014-04-09 08:40:00 | 0.210.243.93 |
| 2014-04-09 13:02:25 | 0.210.25.224 |
| 2014-04-09 13:02:25 | 0.210.25.224 |
| 2014-04-09 13:02:25 | 0.210.25.224 |
| 2014-04-09 13:02:27 | 0.210.25.224 |
+---------------------+---------------+
表1表示对于每个目标IP地址(dIPaddr),它具有一些网络流,这些流具有开始时间(StartTime)。
对于IP:
0.210.208.240
,它具有3个流,但是这些流的时间不是连续的,它具有09:47:53
的两个流,其中一个09:47:55
的流,但是没有09:47:54
。对于IP:
0.210.243.93
,它的一个流使用08:39:55
,一个流使用08:39:57
,一个流使用08:40:00
,但是0个流使用08:39:56,08:39:58,08:39:59
。对于IP:
0.210.25.224
,它具有3个13:02:25
流,一个13:02:27
流,0个13:02:26
流。现在,我要计算具有相同StartTime,相同dIPaddr的流数量,并将它们加起来。这意味着,首先,计算具有相同StartTime的流数量,相同的dIPaddr,获得table2:
+---------------------+---------------+---------------+
| StartTime | dIPaddr | count |
+---------------------+---------------+---------------+
| 2014-04-09 09:47:53 | 0.210.208.240 | 2 |
| 2014-04-09 09:47:54 | 0.210.208.240 | 0 |
| 2014-04-09 09:47:55 | 0.210.208.240 | 1 |
| 2014-04-09 08:39:55 | 0.210.243.93 | 1 |
| 2014-04-09 08:39:56 | 0.210.243.93 | 0 |
| 2014-04-09 08:39:57 | 0.210.243.93 | 1 |
| 2014-04-09 08:39:58 | 0.210.243.93 | 0 |
| 2014-04-09 08:39:59 | 0.210.243.93 | 0 |
| 2014-04-09 08:40:00 | 0.210.243.93 | 1 |
| 2014-04-09 13:02:25 | 0.210.25.224 | 3 |
| 2014-04-09 13:02:26 | 0.210.25.224 | 0 |
| 2014-04-09 13:02:27 | 0.210.25.224 | 1 |
+---------------------+---------------+---------------+
从表2中我们可以看到,对于dIPaddr:0.210.208.240,它具有(3条记录),将其命名为table_240:
+---------------------+---------------+---------------+
| StartTime | dIPaddr | count |
+---------------------+---------------+---------------+
| 2014-04-09 09:47:53 | 0.210.208.240 | 2 |
| 2014-04-09 09:47:54 | 0.210.208.240 | 0 |
| 2014-04-09 09:47:55 | 0.210.208.240 | 1 |
对于dIPaddr 0.210.243.93,它具有(6条记录),将其命名为table_93:
| 2014-04-09 08:39:55 | 0.210.243.93 | 1 |
| 2014-04-09 08:39:56 | 0.210.243.93 | 0 |
| 2014-04-09 08:39:57 | 0.210.243.93 | 1 |
| 2014-04-09 08:39:58 | 0.210.243.93 | 0 |
| 2014-04-09 08:39:59 | 0.210.243.93 | 0 |
| 2014-04-09 08:40:00 | 0.210.243.93 | 1 |
对于dIPaddr:0.210.25.224,它的名称为table_224:
| 2014-04-09 13:02:25 | 0.210.25.224 | 3 |
| 2014-04-09 13:02:26 | 0.210.25.224 | 0 |
| 2014-04-09 13:02:27 | 0.210.25.224 | 1 |
+---------------------+---------------+---------------+
然后我想做:
table_240.count+table_93.count+table_224.count
,获取一个名为table_final的新表,但在table_final中,记录数应为table_240,table_93和table_224的最小数。因此,table_final应该是:
+-------+
| count |
+-------+
| 6 |
| 0 |
| 3 |
+-------+
(6=2+1+3, 2 is the first record in table_240,1 is the first record in table_93,3 is the first record in table_224.)
(0=0+0+0, 0 is the second record in each of table_240,93,224)
(3=1+1+1, 1 is the third record in each of table_240,93,224)
我怎么做才能得到table_final?
上面只是一个简单的例子,我的table1有570000条记录,超过5000个dIPaddr,每个dIPaddr有100多个流的记录(这意味着100多个StartTime记录)。table_final应该保存所有行中的最小行数这些table_dIPaddr。
因此table_final可能有100行或200行或更多行,这取决于这些table_dIPaddr中的最小行数是多少(在上面的示例中,table_240,table_93,table_224属于table_dIPaddr.Table_dIPaddr表示对行数进行计数,组table1由dIPaddr,StartTime)。现在的情况是我只有table1,我显示table_240,table_93等只是为了解释我的需要。在表1中,有数千个dIPaddr,每个dIPaddr有100多个流。如何使用table1获得table_final?
我想使用计数来获取table2,我有一些提示,但仍然不知道如何获取table2。我想如果我想获得table_final,我应该首先获得表2,但是我不知道如何获得table2。如果我只有一个dIPaddr,我知道如何获取table2,但我不知道如何使用不同的dIPaddr。
这是mysql如何获取table2。(一些提示)
how to count the num of records in a group in mysql
首先,我们需要创建统计:
CREATE TABLE tally(n INT NOT NULL AUTO_INCREMENT PRIMARY KEY);
INSERT INTO tally
SELECT a.N + b.N * 10 + c.N * 100 + d.N * 1000 + e.N * 10000 + 1 n
FROM
(SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6) a
,(SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6) b
,(SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 ) c
,(SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) d
,(SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) e
ORDER BY n;
(因为一天有24小时,所以记录数需要大于3600 * 24。)
然后,我创建一个表,该表仅包含Starttime和
0.210.208.240
的dIPaddr,命名为:temp240,在temp240中,它具有: +---------------------+---------------+
| StartTime | dIPaddr |
+---------------------+---------------+
| 2014-04-09 09:47:53 | 0.210.208.240 |
| 2014-04-09 09:47:53 | 0.210.208.240 |
| 2014-04-09 09:47:55 | 0.210.208.240 |
+---------------------+---------------+
然后创建一个名为test240的表,
insert into test240
SELECT b.starttime, COALESCE(count, 0) count
FROM
(
SELECT min_dt + INTERVAL n-1 SECOND starttime
FROM tally t CROSS JOIN
(
SELECT MIN(starttime) min_dt, MAX(starttime) max_dt
FROM temp240
WHERE starttime >= '2014-04-09'
AND starttime < '2014-04-09' + INTERVAL 1 DAY
) i
WHERE t.n-1 <= TIMESTAMPDIFF(SECOND, min_dt, max_dt)
) b LEFT JOIN
(
SELECT starttime, COUNT(*) count
FROM temp240
WHERE starttime >= '2014-04-09'
AND starttime < '2014-04-09' + INTERVAL 1 DAY
GROUP BY starttime
) q
ON b.starttime = q.starttime;
然后我得到test240:
+---------------------+---------------+
| StartTime | count |
+---------------------+---------------+
| 2014-04-09 09:47:53 | 2 |
| 2014-04-09 09:47:54 | 0 |
| 2014-04-09 09:47:55 | 1 |
+---------------------+---------------+
但我不知道如何获取table2,因为实际上table1包含数千个dIPaddr,我无法为每个dIPaddr创建数千个tempdIPaddr,然后获取其对应的testdIPaddr表。我不知道如何在mysql之上进行修改以计算所有dIPaddr的。
最佳答案
首先,不要将每个IP地址放在不同的表中。将它们全部放在一个单独的表中,按dIPaddr,StartTime分组。
确保此计数表具有自动递增的ID字段(例如CountRowId),并且按dIPaddr,StartTime的顺序输入计数结果。
现在,进一步按dIPaddr(仅)分组,并找到每个dIPaddr的CountRowId值的最小值和最大值。
再增加一列(例如OrdinalWithinIP),对于每条记录,将其设置为dIpaddr MINUS CountRowId的Max(CountRowId)。对于每个IPaddr,这将为您提供每个计数记录的序号,例如1、2、3等。
然后,按序数分组并进行汇总。
关于mysql - 如何计算记录数并将其添加到mysql中?(使用计数),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28681662/