0

このクエリは正常に機能しています。これは、contest_entriesの連絡先IDがpersonテーブルの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

ここで、email_list_subscription_logで連絡先IDが一致するレコードが少なくとも1つあるレコードの数を照会したいのですが、そのテーブルには1つの連絡先IDのログレコードが多数含まれている可能性があります。

複数のレコードによって膨らまされないカウントを与える結合を作成するにはどうすればよいですか?

最初のクエリのバージョンを使用して、すべての連絡先IDをtmpテーブルに取得し、それを使用する必要がありますか?

4

2 に答える 2

1

email_list_subscription_logをDISTINCTまたはGROUPでデフレートする必要があります。

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を使用すると、要素ごとに1行を返しながら、レコード数をカウントできます。

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

このJOIN構文では、WHEREは必要ありませんが、追加のフィルタリングが必要な場合は、WHEREをそのままにしておきます。

于 2012-07-19T17:07:53.900 に答える
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 に答える