0

此查询工作正常。它给出了比赛参赛者的数量,他们在比赛条目中的联系人 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 的许多日志记录。

如何编写一个联接,使我的计数不会被多条记录夸大?

我是否应该使用我的第一个查询的版本将所有联系人 ID 放入 tmp 表中并使用它?

4

2 回答 2

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
于 2012-07-19T17:05:37.873 回答
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 不是必需的,但如果您需要额外的过滤,我会保留它。

于 2012-07-19T17:07:53.900 回答