5

次の MySQL クエリでテーブルを結合して、distinct の使用を避けることはできますか? Invited_by_id は、このユーザーを招待したユーザーのユーザー ID を示します。

SELECT
    user1.id, count(distinct user2.id) AS theCount, count(distinct user3.id) AS theCount2
FROM
    users AS user1
LEFT OUTER JOIN
    users AS user2 ON user2.invited_by_id=user1.id
LEFT OUTER JOIN (
    SELECT id, invited_by_id FROM users WHERE signup_date >= NOW() - INTERVAL 30 DAY
) AS user3 ON user3.invited_by_id=user1.id
GROUP BY user1.id;
4

3 に答える 3

3

ここでは、ユーザーが招待された回数と、そのユーザーが過去 30 日間に招待された回数を取得しようとしていると想定しています。

この場合、次のような単純な条件付き合計でクエリを実行できます。

select user1.id, count(user2.id) as tehCount, sum(user2.signup_date >= NOW() - INTERVAL 30 DAY) as theCount2
from users as user1
left outer join users as user2 on user2.invited_by_id = user1.id
group by user1.id

theCount2 の null が問題になる場合は、合体を次のように使用します。

coalesce(sum(user2.signup_date >= NOW() - INTERVAL 30 DAY), 0)
于 2010-01-29T17:21:01.870 に答える
1

このようなことを試してみてください。サブクエリのテーブル名を変更して、少しわかりやすくしました。

Select
    user.id,
    all_time.total AS theCount, 
    last_month.total AS theCount2
From users AS user
Left Outer Join 
    (Select Count(id) as total, invited_by_id
     From users
     Group By invited_by_id) as all_time
       On all_time.invited_by_id = user.id
Left Outer Join
    (Select Count(id) as total, invited_by_id
     From users 
     Where signup_date >= NOW() - INTERVAL 30 DAY
     Group By invited_by_id) AS last_month 
       On last_month.invited_by_id = user.id

これが頻繁に実行されるものである場合は、user.invited_by_idインデックスが作成されていることを確認してください。

于 2010-01-30T01:05:36.670 に答える
1

バージョン 5.0.37 より後の MySQL を実行している場合は、プロファイラーを使用できます。これにより、任意のクエリでボトルネックがどこにあるかをかなりよく知ることができます。それは良い出発点かもしれません-それを解釈する最善の方法がわからない場合は、出力を元の質問に編集することができます.

于 2010-01-29T12:40:39.933 に答える