Php 无法返回MySQL查询的结果

Php 无法返回MySQL查询的结果,php,mysql,Php,Mysql,我的目标是只显示尚未收到所有产品的采购订单 我有一个名为test_po的主表和另外两个表test_po_bom,test_rog_bom。test\u po\u bom和test\u rog\u bom表是我存储产品列表的地方。test\u po\u bom是我订购的产品列表,test\u rog\u bom是我收到的产品列表 基本上:循环采购订单,其中收到的产品

我的目标是只显示尚未收到所有产品的采购订单

我有一个名为test_po的主表和另外两个表test_po_bom,test_rog_bom。test\u po\u bom和test\u rog\u bom表是我存储产品列表的地方。test\u po\u bom是我订购的产品列表,test\u rog\u bom是我收到的产品列表

基本上:循环采购订单,其中收到的产品<订购的产品

表结构:

代码:

它没有吐出任何东西,我尝试了许多不同的变体,但我就是想不出来。

这是未经测试的代码。很抱歉,我发布了未经测试的代码,但我现在无法对其进行测试,并且我认为这说明了一些事情,您可以尝试不同的方法,即使它并不完全正确

试试这个:

select po.ID, po_bom.quant n_ordered, rog_bom.quant n_received
from test_po po
left join (select po_ID, sum(quantity) as quant from test_po_bom group by po_ID) po_bom
  on po.ID = po_bom.po_ID
left join (select po_ID, sum(quantity) as quant from test_rog_bom group by po_ID) rog_bom
  on po.ID = rog_bom.po_ID
where coalesce(rog_bom.quant, 0) < coalesce(po_bom.quant, 0);
这改变了您的工作方式:

使用表别名明确指定哪些引用引用同一表行。 使用group by按ID聚合总和。 使用coalesce处理至少一个表可能test_rog_bom没有ID行的情况。我怀疑这实际上是问题的根源。
问题似乎与您的查询有关。不要使用*而是指定所需的列。下面的解决方案使用别名来帮助提高代码的可读性,尤其是使用相似的名称。你也会注意到,而不是在哪里

SELECT 
    p.ID as PO_ID
     ,p.VENDOR_ID
     ,pb.product_ID as PRODUCT_ID
     ,SUM(pb.quantity) as QUANTITY_ORDERED
     ,SUM(rb.quantity) as QUANTITY_RECEIVED
FROM test_po as p
LEFT JOIN test_po_bom as pb ON pb.po_ID = p.ID
LEFT JOIN test_rog_bom as rb ON rb.po_ID = p.ID
GROUP BY
    p.ID
     ,p.VENDOR_ID
     ,pb.product_ID
HAVING SUM(rb.quantity) < SUM(pb.quantity)

这可能无助于回答您的问题,但您应该停止使用mysql_*函数。他们被弃用了。请改用从PHP5.1起支持的或从PHP4.1起支持的。如果你不确定使用哪一个,如果你没有得到输出,那么你就没有结果。尝试单独调试查询。对于初学者,请使用表别名。它们使您的查询更具可读性,并且是复杂联接所必需的。@NateC-K required在我看来是一个强有力的词。我同意非常需要它们,但文档和规范很好地定义和区分了这些词required/must/can/should。@MihaiStancu:您还打算如何将表联接到自身?我想知道是否有其他语法可以实现这一点。你做到了,非常感谢!你们总是让我惊讶,你们能如此迅速地理解一个问题,并能在几分钟内返回一个正确的答案。我印象深刻,谢谢你的帮助。谢谢内特,你帮了大忙!我一直在想如何包含带有左连接的空行,并将其合并。
select po.ID, po_bom.quant n_ordered, rog_bom.quant n_received
from test_po po
left join (select po_ID, sum(quantity) as quant from test_po_bom group by po_ID) po_bom
  on po.ID = po_bom.po_ID
left join (select po_ID, sum(quantity) as quant from test_rog_bom group by po_ID) rog_bom
  on po.ID = rog_bom.po_ID
where coalesce(rog_bom.quant, 0) < coalesce(po_bom.quant, 0);
SELECT 
    p.ID as PO_ID
     ,p.VENDOR_ID
     ,pb.product_ID as PRODUCT_ID
     ,SUM(pb.quantity) as QUANTITY_ORDERED
     ,SUM(rb.quantity) as QUANTITY_RECEIVED
FROM test_po as p
LEFT JOIN test_po_bom as pb ON pb.po_ID = p.ID
LEFT JOIN test_rog_bom as rb ON rb.po_ID = p.ID
GROUP BY
    p.ID
     ,p.VENDOR_ID
     ,pb.product_ID
HAVING SUM(rb.quantity) < SUM(pb.quantity)