私は、十分に単純なクエリと思われるものに苦労してきました。アカウント、連絡先、アクティビティの 3 つのテーブルがあります。アクティビティが記録されるたびに、AccountID、Contact Subject、TimeDate が記録されます。
各 AccountID の前週のすべてのアクティビティ数を表示するために、Activities テーブルにクエリを実行します。
私が使う:
select
accounts.account as Account,
count(distinct activities.contactid) as Users,
from accounts, activities
where activities.accountid=accounts.accountid
AND completeddate >= curdate() - INTERVAL DAYOFWEEK(curdate())+6 DAY
AND completeddate < curdate() - INTERVAL DAYOFWEEK(curdate())-1 DAY
group by accounts.account asc;
結果は次のようになります。
Account Users
ACME Ltd 4
Warner Bros 6
RBS 9
等..
アクティビティ テーブルには約 2,000 万行あり、これは約 20 秒で実行されます。
ただし、包括的なリストが必要です。その結果を、その月に活動がなかった AccountID のリストと組み合わせたいと考えています。
Account Users
ACME Ltd 4
Warner Bros 6
RBS 9
Microsoft 0 or NULL
等...
私はこのようにUNIONしようとしました:
select Account, '' from Accounts
UNION
select
accounts.account as Account,
count(distinct activities.contactid) as Users
from accounts, activities
where activities.accountid=accounts.accountid
AND completeddate >= curdate() - INTERVAL DAYOFWEEK(curdate())+6 DAY
AND completeddate < curdate() - INTERVAL DAYOFWEEK(curdate())-1 DAY
group by accounts.account asc;
UNION について私が理解していることから、一意のリスト (重複なし) を返す必要があるということです。しかし、約 900 個のアカウントしかないのに、約 1400 個のアカウントのリストが表示されます。
LEFT OUTER JOIN を試しましたが、これは永遠に実行されているように見えました (2 時間後に終了しました)。
私が試せることについて何か提案はありますか?
ありがとう