Sql 如何优化嵌套查询?
我可以在下面的MySQL查询中以某种方式连接表并避免使用distinct吗。 invested_by_id显示邀请此用户的用户idSql 如何优化嵌套查询?,sql,mysql,nested-queries,Sql,Mysql,Nested Queries,我可以在下面的MySQL查询中以某种方式连接表并避免使用distinct吗。 invested_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
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;
如果您运行的MySQL版本大于5.0.37,您可以使用一个数据库,它可以让您非常清楚任何查询的瓶颈在哪里。这可能是一个很好的起点-如果您不确定如何最好地解释它,您可以将输出编辑为原始问题。我在这里假设您正在尝试获取一个用户在过去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
如果计数器2中的空值有问题,请使用合并,如下所示:
coalesce(sum(user2.signup_date >= NOW() - INTERVAL 30 DAY), 0)
尝试这样做,我更改了子查询表的名称以使其更加清晰:
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.invested\u by\u id
编制索引 为什么你需要不同的?在我看来,用户X只能被用户Y邀请一次。@Lieven因为表被连接了两次,所以可以得到重复的行。啊。。。现在这就更有意义了!:)