2012-07-19 62 views
0

这个查询运作良好。它给出了比赛参赛者的人数,比赛参赛者中的联系人ID是他们在人员表中的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 2012-07-19 17:33:10

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 2012-07-19 18:22:09