[英]PHP odbc_exec not returning all rows
这个简单的查询
SELECT
DBA.Goods.ID, /* PK in the Goods table */
DBA.Goods.Name,
DBA.GoodsGroup.Name as GdGrp,
DBA.InvoiceItem.Qty,
DBA.InvoiceItem.ID, /* PK in the InvoiceItem table */
DBA.InvoiceItem.PrintName,
DBA.InvoiceItem.Price,
DBA.InvoiceItem.InvoiceID, /* PK in the Invoice table, a parent table of a sort */
DBA.InvoiceItem.InvoiceItemOrder,
DBA.InvoiceItem.ProcPrice,
FROM (
DBA.Goods INNER JOIN DBA.InvoiceItem
ON DBA.Goods.GoodsSk = DBA.InvoiceItem.GoodsSK
)
INNER JOIN DBA.GoodsGroup
ON DBA.Goods.GroupID = DBA.GoodsGroup.ID
WHERE DBA.InvoiceItem.InvoiceID = $invoiceID /* ID of a specific invoice, used here to get to its contents, i.e. specific items within that invoice */
在 DBExplorer(用于执行原始 SQL 查询的数据库工具)中运行时,返回 5 行(发票内容)。 一切都以这样一种方式设置,即发票可能包含多个具有相同 ID 的货物(但具有不同的价格和采购价格、印刷名称 - 例如桶白、桶蓝、桶红等)。 每个项目在Items
表中都有一个唯一的 ID。 上述5行是预期结果(即列表中的商品为实际售出的商品)。
但是,当查询通过以下方式发送到数据库时:
$result = odbc_exec($conn,$query);
odbc_num_rows($results)
不是 5,正如预期和在 DBExplorer 中看到的那样,而是 3 - 不返回(感知的)重复项(在上一个示例中的所有存储桶中,只返回一个)。
此外,在循环遍历结果时
while($rowItems = odbc_fetch_object($result) {
...
}
只有 3 次迭代,而不是预期的 5 次。
考虑到列顺序可能会导致问题(我知道这很愚蠢),我将DBA.InvoiceItem.ID
移到顶部,使其成为结果集中的第一列。 然而,这没有任何作用。
为什么会发生这种情况,我怎样才能让它返回完整的结果集?
笔记
我知道在 SO 上也有类似的问题:
但它们都没有真正解决这里提出的问题 - 如何获取数据库工具中看到的所有行,而不是减少结果集。
问题出在查询上。 一旦我通过改变加入顺序来改变它,一切都按预期进行。 关键是让DBA.InvoiceItem
成为主表,并将所有内容与它连接起来。 我仍然不知道(清楚)为什么这有效。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.