2

我的任务包括从一个不断更新的 MySQL 表中读取数据:

CREATE TABLE mailing (
    addr VARCHAR(255) NOT NULL
);

(我知道,没有 date_created 字段或任何东西,有点随意,但这就是我得到的)

该表应该包含数百万个电子邮件地址,并且每天都会添加更多。

我应该将这个表中所有域的最近 30 天的每日增长计算在一个单独的表中,我使用以下方法创建:

CREATE TABLE domain_count (
    domain VARCHAR(255) NOT NULL PRIMARY KEY,
    total_count INT(11) NOT NULL DEFAULT 0,
    count_1 INT(11) NOT NULL DEFAULT 0,
    count_2 INT(11) NOT NULL DEFAULT 0,
    ...
    count_30 INT(11) NOT NULL DEFAULT 0
);

如果说,在第 1 天邮件表包含来自单个域的 10 个地址,在第 2 天它包含 15 个地址,那么我想要 domain_count.count_1 = 10 和 domain_count.count_2 = 5

为此,我需要跟踪两件事:一是截至昨天邮寄表中的地址总数(所以对于第 2 天,我应该在某处存储“10”,对于第 3 天,我应该有“ 15" 存储在某处;这样我可以从邮件表的第 11/16 列继续搜索)。另一个是最新的 count_# 值,因为我需要知道在第 2 天插入 count_2 (并在第 31 天循环回到 count_1)。

我可以很容易地将这些值存储在一个单独的文件中,但是做这样的事情感觉真的很乱。是否有一个 MySQL 查询可以让我将这些值与表本身关联起来?

4

2 回答 2

1

你描述的没有标准,没有。

INFORMATION_SCHEMA,它SQL 标准的一部分。TABLES表有一列TABLE_ROWS,但这仅显示当前行数。

要按照您的描述进行操作,我将基于 TABLES 表创建另一个常规表,添加一个 TIMESTAMP 列,并定期将 I_S 表中的行复制到我自己的表中。

CREATE TABLE mydatabase.TABLES like INFORMATION_SCHEMA.TABLES;

ALTER TABLE mydatabase.TABLES ADD COLUMN updated_at TIMESTAMP;

/* once per day do the following: */    
INSERT INTO mydatabase.TABLES 
 SELECT *, NOW() FROM INFORMATION_SCHEMA.TABLES
 WHERE (table_schema, table_name) = ('mydatabase', 'mytable');
于 2013-07-19T22:07:39.153 回答
1

回答您的具体问题:用于报告的数据的这种聚合和非规范化通常由数据仓库而不是 DBMS 涵盖。

为了帮助您解决问题,一个更整洁的结构可能如下:

CREATE TABLE `domain_count` (
    `domain` VARCHAR(255) NOT NULL PRIMARY KEY,
    `date` DATE NOT NULL,
    `count` INT(11) NOT NULL DEFAULT 0
);

它仍然将数据的聚合与数据本身分开,但您可能会发现该结构更容易根据您的要求进行查询。您可以使用日期范围/ BETWEEN运算符来获取您感兴趣的范围,并对计数进行求和或使用 GROUP BY 按域、月份等进行分组。

于 2013-07-19T22:12:08.987 回答