表格:
User
UserId
UserRelation
UserRelationId | ManagerUserId (fk to User.UserId) | UserId
UserBusinessRelation
UserBusinessSaleId | BusinessId | UserId
Business
BusinessId
CampaignGroup
CampaignGroupId | BusinessId
Campaign
CampaignId | CampaignGroupId
Adgroup
AdgroupId | CampaignId
AdgroupKeyword
AdgroupKeywordId | AdgroupId
Click
ClickId | AdgroupKeywordId | Time (Unix Time, Double, Unsigned)
ClickAction
ClickActionId | ClickId | Time (unix time Double, Unsigned)
其中的第一列是PrimaryKey,自动增量
问:我该如何以最有效的方式加入这些组织,因为我完全知道每个企业和数百个企业很容易就会有十万次点击?
这是我的问题:
select count(distinct(ca.ClickActionId)), count(distinct(cl.ClickId)) from ClickAction ca
inner join Click cl on cl.ClickId=ca.ClickId
inner join AdgroupKeyword ak on ak.AdgroupKeywordId=cl.AdgroupKeywordId
inner join Adgroup a on a.AdgroupId=ak.AdgroupId
inner join Campaign c on c.CampaignId=a.CampaignId
inner join CampaignGroup cg on cg.CampaignGroupId=c.CampaignGroupId
inner join Business b on b.BusinessId=cg.BusinessId
inner join UserBusinessSale ubs on ubs.BusinessId=b.BusinessId
inner join UserRelation ur on ur.UserId=ubs.UserId
where ur.ManagerUserId=3
这个问题是我得到了:Array ( [0] => stdClass Object ( [count(distinct(ca.ClickActionId))] => 38290 [count(distinct(cl.ClickId))] => 38290 ) )
。。。我绝对知道这是不正确的,因为点击次数比点击操作多得多(可能至少多10倍(
首先,关系似乎有问题——业务真的有必要吗?看起来您是通过UserBusinessRelation和CampaignGroup的两个外键加入的。隔离计数-运行SQL两次,每个count语句一次,看看是否有什么不同。
此外,我同意托尼·霍普金森的观点——如果你试图计算尚未点击的点击量,那么你需要外部连接。仔细一看,您的点击/点击操作关系可能是向后的。。单击操作取决于是否存在单击。
如果count(distinct列(独立工作,那么最好一个接一个地运行两个查询,甚至在一个事务中运行两个,因为mySql已经缓存了计数所需的表的索引。