Php 如何使用mysql删除嵌套循环
我试着改成这个,但结果不一样:Php 如何使用mysql删除嵌套循环,php,mysql,Php,Mysql,我试着改成这个,但结果不一样: $sqlcmd = "SELECT * FROM inventory WHERE category='$category'"; $temp = mysql_query($sqlcmd); while ( $value = mysql_fetch_array($temp) ) { $sqlcmd = "SELECT SUM(quantity) AS pending FROM withdrawals WHERE
$sqlcmd = "SELECT * FROM inventory WHERE category='$category'";
$temp = mysql_query($sqlcmd);
while ( $value = mysql_fetch_array($temp) ) {
$sqlcmd = "SELECT SUM(quantity) AS pending
FROM withdrawals
WHERE item_code='$value[item_code]'
AND withdraw_number IN (
SELECT withdraw_number
FROM withdrawal_number
WHERE is_dispatched=0 AND (series_type='DC' OR series_type='D') )";
$temp2 = mysql_query($sqlcmd);
$value2 = mysql_fetch_array($temp2);
}
您在第二个查询中缺少序列类型检查。如果你想得到零和,你需要使用左连接
而且您不应该在GROUP BY中包含RECUN_number,因为您在原始查询中没有按该编号分组,它只是用于筛选
$sqlcmd = "SELECT i.item_code, i.item_category, i.item_description, i.quantity, i.reorder_point, SUM(w.quantity) AS pending
FROM inventory i, withdrawals w, withdrawal_number wn
WHERE i.item_code=w.item_code
AND w.withdraw_number=wn.withdraw_number
AND i.category='Store'
AND wn.is_dispatched=0
GROUP BY i.item_code, wn.withdraw_number";
$temp = mysql_query($sqlcmd);
while ( $value = mysql_fetch_array($temp) ) {
}
在最里面的子查询中需要SELECT DISTINCT,以防止总和乘以具有相同取款编号的行数
您还应该停止使用mysql_*函数。它们已被弃用多年,并在PHP7中完全删除。您应该使用mysqli或PDO,并使用带参数的准备语句,而不是将变量替换到SQL中。学习使用ANSI连接语法而不是交叉乘积。您在第二个查询中缺少series_类型条件。你有i.category='Store'而不是i.category='$category'。如果你想为没有取款的项目得到零和,你还需要使用LEFT JOIN。我一直在出错。我使用的是MySQL 5.0.24a,可能不支持左连接?我忘记了其中一个子查询的别名。是否每个派生表都必须有别名?
$sqlcmd = "SELECT i.*, IFNULL(pending, 0) AS pending
FROM inventory i
LEFT JOIN (
SELECT item_code, SUM(pending) AS pending
FROM withdrawals w
JOIN (SELECT DISTINCT withdraw_number
FROM withdrawal_number
WHERE dispatched = 0 AND series_type IN ('DC', 'D')
) AS wn ON w.withdraw_number=wn.withdraw_number
GROUP BY item_code
) AS w ON i.item_code=w.item_code
WHERE i.category='$category'";