简体   繁体   English

如何将这个嵌套的php / mysql查询更改为1个更高效的查询?

[英]How do I change this nested php/mysql query into 1 more efficient query?

I'm looking for some help making my php/MySQL code more efficient. 我正在寻找使我的php / MySQL代码更高效的帮助。 At the moment I've got a nested SQL statement in my PHP code which is taking forever to run. 目前,我的PHP代码中有一个嵌套的SQL语句,该语句将永远运行。 I know there is a more efficient way and doing the query in one statement but I'm struggling work out how to do it. 我知道有一种更有效的方法,可以在一条语句中执行查询,但是我正在努力寻找方法。

Basically, I have 2 tables. 基本上,我有2张桌子。 'customers' and 'purchases'. “客户”和“购买”。 I want to run through the 'customers' table and count/display how many purchases they have made from the 'purchases' table. 我想浏览“客户”表并计算/显示他们从“购买”表中进行了多少购买。

This is my php/mysql code: 这是我的php / mysql代码:

$sql = "SELECT CustomerID, Username, Active FROM customers WHERE AND Active = 'Y'"; 
$result = mysql_query($sql,$connection);
while ($myrow = mysql_fetch_array($result)) {

    $sql2 = "SELECT COUNT(ID) FROM purchases WHERE AND (CustomerID = $myrow[CustomerID] AND (Date BETWEEN $date1 AND $date2) )
    $result2 = mysql_query($sql2,$connection);
    $TotalPurchases = mysql_result($result2,0,”count(ID)”);

}

Which outputs: 哪个输出:

MrSmith: 10
MrsGreen: 4
MrGrey: 1
MissDonna: 0

I could probably turn it into 1 query if it wasn't for the variables $date1 and $date2 (Date BETWEEN $date1 AND $date2) which is calculated in php. 如果不是$ php中计算的变量$ date1和$ date2($ date1和$ date2之间的日期),我可能将其转换为1个查询。 Any advice on how to make this a more efficient query? 关于如何使此查询更有效的任何建议?

Thanks 谢谢

Carlos 卡洛斯

Please try this query, 请尝试此查询,

SELECT c.CustomerID, Username, Active , COUNT(p.CustomerID)
    FROM customers as c
    left join purchases as p ON c.CustomerID = p.CustomerID
         AND Date BETWEEN $date1 AND $date2
    group by p.CustomerID 

I think this can help you. 我认为这可以为您提供帮助。

SELECT  c.CustomerID, c.Username, c.Active , COUNT(*)
    FROM  customers as c
    join  purchases as p ON c.CustomerID = p.CustomerID
      AND  p.Date BETWEEN $date1 AND $date2
    group by  p.CustomerID 

Notes: JOIN, not LEFT JOIN. 注意:JOIN,不是LEFT JOIN。 COUNT(*). 计数(*)。

purchases should have compound INDEX(Date, CustomerID) . purchases应具有复合INDEX(Date, CustomerID)

This might be even faster ( Edited ): 这可能甚至更快( 编辑 ):

SELECT  c.CustomerID, c.Username, c.Active , p.ct
    FROM ( SELECT CustomerID, COUNT(*) ct FROM purchases
              WHERE Date BETWEEN $date1 AND $date2
              GROUP BY CustomerID ) p
    JOIN  customers AS c   ON c.CustomerID = p.CustomerID

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM