【问题标题】:How do I change this nested php/mysql query into 1 more efficient query?如何将此嵌套的 php/mysql 查询更改为 1 个更有效的查询?
【发布时间】:2015-03-30 11:18:30
【问题描述】:

我正在寻求一些帮助,以提高我的 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

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

谢谢

卡洛斯

【问题讨论】:

    标签: php mysql nested


    【解决方案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 
    

    我认为这可以帮助你。

    【讨论】:

    • 感谢 Zinal 的询问。但是当我运行它时,它只是跑了又跑,从未完成。即使我在其上设置了 LIMIT 2,它仍会继续运行,因此我不得不停止查询,因为它使网站无法正常工作...
    【解决方案2】:
    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 
    

    注意:JOIN,而不是 LEFT JOIN。计数(*)。

    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
    

    【讨论】:

    • 太棒了!这很好用,而且速度更快。谢谢瑞克,不胜感激。
    • 糟糕——我的“更快”版本没有更快;我现在已经修好了。
    猜你喜欢
    • 2013-08-23
    • 2017-04-14
    • 1970-01-01
    • 1970-01-01
    • 2020-12-29
    • 2023-01-11
    • 2021-12-24
    • 2018-11-08
    • 2014-12-28
    相关资源
    最近更新 更多