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

时间:2015-03-30 11:18:30

标签: php mysql nested

我正在寻找一些帮助,使我的php / MySQL代码更有效率。目前,我的PHP代码中有一个嵌套的SQL语句,需要永远运行。我知道有一种更有效的方法,并在一个声明中进行查询,但我正在努力解决如何做到这一点。

基本上,我有2张桌子。 '客户'和'购买'。我想浏览“客户”表并计算/显示他们从“购买”表中购买了多少商品。

这是我的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)”);

}

哪个输出:

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

如果对于变量$ date1和$ date2(Date BETWEEN $ date1 AND $ date2)不是在php中计算的话,我可能会把它变成1个查询。关于如何使这个更有效的查询的任何建议?

由于

卡洛斯

2 个答案:

答案 0 :(得分:1)

请尝试此查询,

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 

我认为这可以帮助你。

答案 1 :(得分:0)

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 

注意:加入,而不是LEFT JOIN。 COUNT(*)。

purchases应该有化合物INDEX(Date, CustomerID)

这可能更快(已编辑):

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