Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何优化嵌套查询?_Sql_Mysql_Nested Queries - Fatal编程技术网

Sql 如何优化嵌套查询?

Sql 如何优化嵌套查询?,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

我可以在下面的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.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因为表被连接了两次,所以可以得到重复的行。啊。。。现在这就更有意义了!:)