Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/232.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php SQL链接三个表并求和_Php_Sql - Fatal编程技术网

Php SQL链接三个表并求和

Php SQL链接三个表并求和,php,sql,Php,Sql,我有三张桌子,tblPresents,tblPresentsOrdered和tblPresentsDelivered 我想做的是汇总给定当前ID的所有订单和交付,这样我就可以汇总订单和交付的总数,并检查差异 到目前为止,我有以下几点: $sql ='SELECT prsName, SUM(ordQuantity) AS qtyOrdered, SUM(delQuantity) AS qtyDelivered FROM tblPresentOrders LEFT JOIN tblPresentDe

我有三张桌子,tblPresents,tblPresentsOrdered和tblPresentsDelivered

我想做的是汇总给定当前ID的所有订单和交付,这样我就可以汇总订单和交付的总数,并检查差异

到目前为止,我有以下几点:

$sql ='SELECT prsName, SUM(ordQuantity) AS qtyOrdered,
SUM(delQuantity) AS qtyDelivered
FROM tblPresentOrders
LEFT JOIN tblPresentDeliveries
ON tblPresentDeliveries.delPresent = tblPresentOrders.ordPresent
RIGHT JOIN tblPresents ON tblPresents.prsID = tblPresentOrders.ordPresent
GROUP BY prsName';
第一列(已订购)汇总正确,但交付量将计算两次交付量(该行有两个单独的订单)


我做错了什么?

因为每次交付可以有多个订单(并且每个订单可能有多个礼物),所以在加入之前,您需要在派生表中执行聚合,以避免计数/求和值重复。请注意,在同一个查询中混合使用
左连接
右连接
可能有点难以理解,因此我仅使用
左连接
s重写了查询

SELECT p.prsName, o.qtyOrdered, d.qtyDelivered
FROM tblPresents p
LEFT JOIN (SELECT ordPresent, SUM(ordQuantity) AS qtyOrdered
           FROM tblPresentOrders
           GROUP BY ordPresent) o ON o.ordPresent = p.prsID
LEFT JOIN (SELECT delPresent, SUM(delQuantity) AS qtyDelivered
           FROM tblPresentDeliveries
           GROUP BY delPresent) d ON d.delPresent = p.prsID

在不查看数据的情况下,我猜测每个
ordPresent
都有多个
delPresent
。是一对一吗?是一对多,一个礼物可能有多个订单和交付,但目前“订单”表中有两个记录,而“交付”表中只有一个记录。每次交付是否有一个订单,反之亦然?不一定。有时我们有加满的订单或送货单,效果很好,我想我明白为什么。只有一个问题,TBLPP的目的是什么?只是一个简写,还是它实际上意味着什么?当我没有这样做就尝试时,它抛出了一个SQL错误。@ChrisC
tblPresents p
(也可以写为
tblPresents as p
)将
p
设置为
tblPresents
的别名,这只会缩短其余查询的编写时间。它是完全可选的,我发现它有助于可读性。