質問

できますか何かの参加テーブルを回避するために使用量の異なる以下のMySQLを返します。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;
役に立ちましたか?

解決

このような何かを試してみてください、私はそれが少し明確にするために、サブクエリのテーブル名を変更します:

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がインデックスされていることを確認してください!

他のヒント

私は、ユーザーが招待された回数をカウントし、ユーザーが過去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でヌルは、問題になるよう合体を使用する場合:

coalesce(sum(user2.signup_date >= NOW() - INTERVAL 30 DAY), 0)

だ走るバージョンのMySQLを超5.0.37い プロファイラ 利用可能とする良いようにボトルネックを任意のモードです。れを進めていくうえで良い出発点がいくつもの編集、出力オリジナルの問題だからないのでどう解釈する。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top