此查询工作正常。它列出了参赛者的数量,参赛者中的联系人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表中并使用它?
答案 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不是必需的,但如果你需要额外的过滤,我会把它保留在那里。