我可以采用某种联接表,避免不同在下面的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