我有一个有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/

10-08 22:30