准确计算此JOIN

时间:2012-07-19 16:57:17

标签: mysql join

此查询工作正常。它列出了参赛者的数量,参赛者中的联系人ID是人员表中的origin_contact。

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表中并使用它?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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不是必需的,但如果你需要额外的过滤,我会把它保留在那里。