实际上,我不知道问题的标题是什么样的,它是否与问题完全相关,但我会尝试解释我的问题:
我有一个名为AdvertClick
的表(除了“AdvertID”存储每个“Advert”的统计数据)和Advert
表之外(因为您猜测存储我的广告列表的主表) 。所以我需要在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 :(得分:0)
嗯......我认为视图适合这种情况你还应该有一个好的结构化表来获得正确的方法我会做的另一种方法是添加另一个列来识别什么类型的数据在那一行,例如:
表:广告
列:名称,国家/地区,类型
该类型将采用您想要的任何值,或者您可以创建另一个表并从那里引用它作为外键,以使其更灵活,在这种情况下,您将只有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;
依此类推。 :)
答案 1 :(得分:0)
我将完全提出其他建议。
我认为你应该只保留一个AdvertClick表 - 不要创建其中的许多表,因此会产生其他令人头疼的问题。为了得到你的答案会更加困难甚至更慢。
相反,如果您确定已优化查询,则可以选择反规范化以收集常用统计信息。
例如:
在单个AdvertClick表上创建一个ON INSERT触发器,该触发器会增加当前Country的新AdvertClickByCountry表中的计数值。此外,创建一个ON DELETE触发器,减少该国家的计数。
然后你上面的查询将是微不足道的 - 类似于:
SELECT click_count, country
from AdvertClickByCountry
ORDER BY Click_count DESC
LIMIT 1