2014-05-17 3 views
0

테이블 반환하지 (() 별개의) 수를 선택 : 이들 각각의 첫 번째 열은 기본 키, 자동 증가8 표에 가입하고 제대로

질문입니다

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) 

: 어떻게 가는가를 가능한 한 가장 효율적인 방법으로 이들을 합치는 것에 대해, 비즈니스 당 수백만 개의 클릭과 수천 개의 비즈니스가 쉽게 될 수 있다는 것을 완전히 알고 있다는 것을 완전히 알고 있습니까? 나는 절대적으로 더 많은 클릭이 clickActions (아마 10 배 더보다가 있기 때문에 정확하지 알고 Array ([0] => stdClass Object ([count(distinct(ca.ClickActionId))] => 38290 [count(distinct(cl.ClickId))] => 38290)) ... :

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

이 가진 문제는 내가 돌아올 것입니다 : 여기

내 쿼리

+3

짐작 하긴하지만, clickaction에 외부 조인이 필요하다고 가정하면 내부 조인은 클릭 동작이없는 모든 클릭을 잘라냅니다. 이 효율성을 높이는 데있어서, 당신이 비정형 화하지 않는 한, 이것은 얻는 것만 큼 좋을 것입니다. –

답변

0

먼저 관계가 잘못되었습니다. 비즈니스가 정말로 필요합니까? 두 개의 외래 키로 UserBusinessRelation 및 CampaignGroup에 가입하는 것으로 보입니다. 카운트를 분리하십시오 - 각각의 카운트 명령문으로 한 번씩 SQL을 두 번 실행하고 다른 것이 있는지 확인하십시오.

또한 Tony Hopkinson에 동의합니다. 아직 클릭이없는 클릭 액션 수를 계산하려는 경우 외부 제휴가 필요합니다. 다시 보면 클릭/클릭 관계가 뒤로 향하게 될 수 있습니다. clickAction은 클릭의 존재 여부에 따라 달라집니다.

count (distinct column)가 독립적으로 작동하면 mySql이 이미 계산에 필요한 테이블의 인덱스를 이미 캐시 했으므로 두 개의 쿼리를 차례로 실행하거나 트랜잭션 내에서 실행하는 것이 가장 좋습니다.

+0

예, 전체적으로 캠페인 그룹이 아니라 비즈니스 자체에 관한 더 많은 정보를 보유하고 있기 때문에 비즈니스가 필요합니다 ...하지만 쿼리에서이를 제거 할 수 있음을 알 수 있습니다. Per Tony의 제안에 따라 먼저 쿼리 테이블을 다시 사용하여 클릭 테이블 -> 왼쪽 조인 ClickAction -> 내부 조인 AdgroupKeyword 등을 클릭하도록 쿼리를 다시 작성했습니다. 또한 특정 날짜의 클릭 수/클릭 수를 검색 한 다음 그 특정 요일의 결과를 캐시하는 동시에 오늘의 클릭 수/액션 수를 증가 키로 구현할 수 있음을 알게되었습니다. –