8表联接和选择计数(distinct())未正确返回

  • 本文关键字:distinct 返回 选择 mysql sql join
  • 更新时间 :
  • 英文 :


表格:

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已经缓存了计数所需的表的索引。

最新更新