Mysql 代码优化-删除嵌套的左联接

Mysql 代码优化-删除嵌套的左联接,mysql,sql,Mysql,Sql,为了使这个查询更有效,我希望能够消除嵌套的左连接。我考虑是否可以将COUNT(ActiveUsers)替换为COUNT(DISTINCT IF(SUM(grand_total)>0,id,NULL)),这样我就可以删除左连接,但是这似乎没有得到正确的结果。以下是我使用的原始代码: SELECT COUNT(DISTINCT users.id) AS NumCustomer, COUNT(ActiveUsers) AS NumActiveCustomers, COUNT(ActiveUsers)/

为了使这个查询更有效,我希望能够消除嵌套的
左连接。我考虑是否可以将
COUNT(ActiveUsers)
替换为
COUNT(DISTINCT IF(SUM(grand_total)>0,id,NULL))
,这样我就可以删除
左连接,但是这似乎没有得到正确的结果。以下是我使用的原始代码:

SELECT
COUNT(DISTINCT users.id) AS NumCustomer,
COUNT(ActiveUsers) AS NumActiveCustomers,
COUNT(ActiveUsers)/COUNT(DISTINCT username) AS CloseRate
FROM users
LEFT JOIN orders ON orders.userid = users.id
LEFT JOIN (SELECT id AS ActiveUsers FROM users LEFT JOIN orders ON orders.userid = users.id GROUP BY id HAVING SUM(grand_total)>0 ) AS Active ON users.id = Active.ActiveUsers
WHERE users.datecreated LIKE '2013%'
GROUP BY YEAR(users.created), MONTH(users.created)
ORDER BY YEAR(users.created), MONTH(users.created)

有什么方法可以提高代码的效率吗?

如果总计不能为负:

SELECT
    COUNT(DISTINCT users.id) AS NumCustomer,
    COUNT(distinct orders.userid) AS NumActiveCustomers,
    COUNT(distinct orders.userid)/COUNT(DISTINCT users.username) AS CloseRate
FROM users
LEFT JOIN orders ON orders.userid = users.id
WHERE users.datecreated LIKE '2013%' and grand_total>0
GROUP BY YEAR(users.created), MONTH(users.created)
ORDER BY YEAR(users.created), MONTH(users.created)

(如果它也不能为零,那么就不需要第二个where条件。)

我认为不需要在orders表上
左JOIN
,因为您希望grant_total的总和大于0。内部连接应该首先在此处发布解释输出以及您的表结构和使用的存储引擎..并用简单的英语重新定义您需要的SQL代码..您好。是 啊我在这里生产的是顾客的数量和买东西的顾客的数量,我称之为ActiveCustomers。所有用户都在用户表中,任何订单都在订单表中。所以我通过检查grand_total>0.Hmmm来检查他们是否买过东西。。。是 啊让我试试这个。计数(DISTINCT users.username)将对所有用户进行计数,然后计数(DISTINCT orders.userid)将对orders表中有条目的所有用户进行计数。