2011-12-19 25 views
0

其实,我不知道它是如何看起来像问题的标题,它是否与问题确切相关,但我会尝试解释我的问题:从10(同样形成)的表中选择数据(创建视图)

我有一个命名为AdvertClick表,除了Advert表(通过“AdvertID”存储每个“广告”的统计数据)(如你猜存储我的广告列出了主表)。因此我需要在AdvertClick表中存储每个广告点击数据(即“国家”,“浏览器”,“语言”等)。例如,代码如下从AdvertClick表中获取顶级国家/地区数据。

SELECT Count(_ac.ID) AS Click, _ac.Country 
FROM `Advert` _a 
LEFT JOIN `AdvertClick` _ac ON _ac.AdvertID = _a.ID 
WHERE _a.UserID = $UserID 
GROUP BY _ac.Country 
ORDER BY Click DESC 
LIMIT 1 

但是,我已经复制AdvertClick表为AdvertClick0, AdvertClick1 ... AdvertClick9,因为它的(唯一的统计数据表)已变得如此沉重,速度较慢。现在,我有10个桌子,所有的桌子都是相同的(意思是桌子)。我只是插入每个点击数据这样;

$TableName = "AdvertClick". $AdvertID % 10; 
$SQL = "INSERT INTO ${TableName} ... VALUES (...)"; 

所以,现在我想要做同样的事情但失败。 我试过CREATE VIEW这种方式非常不同,

CREATE ALGORITHM = TEMPTABLE VIEW _tmp_ (colums...) SELECT x,y,z - >失败
CREATE VIEW _tmp_ (colums...) SELECT x,y,z JOIN AdvertClick0 _ac0 - >失败
等等

有没有人帮我这个(真烦人)的问题?

在此先感谢...

+0

骨料,非规范化,并归档数据!在类似情况下,我们创建按日,月和年命名的每小时和每日归档表,其中包含总值。转储表,在您的情况下AdvertClick,从未持有超过3天的数据。 – Julien 2011-12-19 23:57:25

+0

@Julien我不想分开表格了,我只是想加快我的数据系统,因为很多web开发者都这样做... – 2011-12-20 00:12:33

+0

增加速度是我评论的主要观点:) – Julien 2011-12-20 00:19:04

回答

0

唔...我认为鉴于将适用于这种情况,你也应该有一个很好的结构化表来获得这种正确的做法另一种方法我会做的是添加另一列,将确定是在该行例如什么类型的数据:

表:广告

列:姓名,国家,类型

类型将带你想要的任何值,也可能会创建另一个r表中,并从那里引用它作为外键以使其更加灵活,在这种情况下,您将只有2个表。为了使工作成为一种观点,你可以这样做:

CREATE VIEW 'AdvertClick1' AS SELECT name, country FROM advert WHERE type = 1; 
CREATE VIEW 'AdvertClick2' AS SELECT name, country FROM advert WHERE type = 2; 
CREATE VIEW 'AdvertClick3' AS SELECT name, country FROM advert WHERE type = 3; 

等等等等。 :)

+0

我保持所有数据为相同类型并使用MyISAM引擎。所以我不能使用外接钥匙。就是这样; 'INSERT INTO AdvertClick1 VALUES($ AdvertID,'$ Country','$ Browser',...);' 其实,我不明白你的意思是什么“类型”。 – 2011-12-19 23:55:21

+0

我看到你仍然可以使用相同的方法。以上陈述仅仅是一个解释我的意思的例子,添加一列来确定你真正需要的数据类型,这个列的名字将取决于你的需要。该列将能够将您的数据分组进行某种分类,以便您可以将它们进行分组,而不是根据上面的语句创建10个表,该列将具有相同的列或属性 – 2011-12-20 00:21:19

+0

ok您可以使用另一种方法:* ** INSERT INTO advertClick(advertID,country,browser,click,...)VALUES($ AdvertID,'$ Country','$ Browser',1,...),($ AdvertID,'$ Country', '$ Browser',1,...);INSERT INTO advertClick(advertID,country,browser,click,...)VALUES($ AdvertID,'$ Country','$ Browser',2,...); (广告ID,国家,浏览器,点击,...)VALUES($ AdvertID,'$ Country','$ Browser',3,...); *** 我试图用“点击”这次而不是“类型”,但他们确实有相同的方法,只是我改变了名称 – 2011-12-20 00:29:33

0

我会建议完全别的东西。

我认为你应该只保留一个AdvertClick表 - 不要创建它们中的很多,因此产生这些其他的麻烦。要得到答案会更困难,甚至更慢。相反,如果您确定已经优化了您的查询,则可以选择非规范化来收集常见统计信息。

例如:

创建ON上递增用于当前国家在新AdvertClickByCountry表的计数值与单AdvertClick表INSERT触发器。此外,创建一个ON DELETE触发器,用于减少该国家的计数。

然后将查询以上将是微不足道的 - 这样的:

SELECT click_count, country 
from AdvertClickByCountry 
ORDER BY Click_count DESC 
LIMIT 1