JOIN

2012-07-19 3 views
0

에 정확한 집계이 쿼리는 잘 동작합니다. contest_entries의 컨택 ID가 person 테이블의 origin_contact 인 컨테스트 참가자 수를 제공합니다. JOIN

SELECT c.handle, COUNT(*)   
FROM `contest_entry` ce,   
person p,       
contest c       
WHERE        
p.origin_contact = ce.contact AND 
c.id = ce.contest     
GROUP BY c.id 

은 지금 접촉 ID가 email_list_subscription_log에 일치하지만 해당 테이블이 하나 접촉 ID에 대한 많은 로그 레코드를 가질 수있는 위치 또한 적어도 하나 개의 기록을 얼마나 레코드의 많은 조회 할.

여러 레코드가 부풀어 오지 않는 카운트를 제공하는 조인은 어떻게 작성합니까?

연락처 ID를 모두 tmp 테이블로 가져와 사용하는 첫 번째 쿼리 버전을 사용해야합니까?

답변

1

확실하지하는 필드 접촉 ID입니다,하지만 당신은 이런 식으로 뭔가를 할 수 있습니다

select c.handle, 
    count(*) as count 
from `contest_entry` ce 
inner join person p on p.origin_contact = ce.contact 
inner join contest c on c.id = ce.contest 
where exists (
     select 1 
     from email_list_subscription_log l 
     where l.contact_id = ce.contact 
     ) 
group by c.id 
+0

매력처럼 작동합니다! 고마워요! – jerrygarciuh

1

당신은 DISTINCT 또는 GROUP과 email_list_subscription_log을 수축한다고 : 서브 쿼리에

SELECT c.handle, COUNT(*)   
    FROM `contest_entry` ce 
    JOIN person p ON (p.origin_contact = ce.contact) 
    JOIN contest c ON (c.id = ce.contest) 
    JOIN (SELECT DISTINCT contact, email FROM email_list_subscription_log) AS elsuniq 
     ON (ce.contact = elsuniq.contact) 
[ WHERE ]   
GROUP BY c.id 

사용 GROUP 요소 당 하나의 행을 반환하면서 레코드 수를 계산할 수 있습니다.

JOIN (SELECT contact, count(*) AS elsrecords FROM email_list_subscription_log 
      GROUPY BY contact) AS elsuniq 

이 JOIN 구문을 사용하면 WHERE는 필요하지 않지만 추가 필터링이 필요하면 그대로 두었습니다.

+0

감사합니다. 어떤 이유로 귀하의 질의는 무한정 매달려 있습니다. 30 분 후에 중단되었습니다. – jerrygarciuh