5

我可以以某种方式连接表并避免在以下 MySQL 查询中使用 distinct。被邀请的_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 中的空值有问题,请使用合并:

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

如果您正在运行高于 5.0.37 的 MySQL 版本,那么您可以使用Profiler,它可以让您很好地了解任何查询的瓶颈所在。这可能是一个很好的起点 - 如果您不确定如何最好地解释它,您可以将输出编辑为原始问题。

于 2010-01-29T12:40:39.933 回答
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 回答