我正在寻找一些帮助,使我的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个查询。关于如何使这个更有效的查询的任何建议?
由于
卡洛斯
答案 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