PHP odbc_exec 未返回所有行
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 查询的数据库工具)中 运行 时,returns 5 行(发票内容)。一切都以这样一种方式设置,即一张发票可能包含多个具有相同 ID 的商品(但具有不同的价格和采购价格、印刷名称——例如 bucket-white、bucket-blue、bucket-red 等)。每个项目在 Items
table 中都有一个唯一的 ID。上述5行为预期结果(即列表中的商品为实际售出商品)
但是,当查询通过以下方式发送到数据库时:
$result = odbc_exec($conn,$query);
odbc_num_rows($results)
不是 5,如预期和在 DBExplorer 中看到的那样,而是 3 -(感知到的)重复项未 returned(在上一个示例中的所有存储桶中,只有一个是returned).
此外,在使用
遍历结果时
while($rowItems = odbc_fetch_object($result) {
...
}
只有 3 次迭代,而不是预期的 5 次。
考虑到列顺序可能会导致问题(我知道这很愚蠢),我将 DBA.InvoiceItem.ID
移到了顶部,使其成为结果集中的第一列。然而,那没有任何作用。
为什么会这样,我怎样才能使它成为 return 完整的结果集?
备注
我知道在 SO 上也有类似的问题:
php odbc_exec not returning all results
why doesn't this code return all rows?
Not getting all rows from a query with odbc_exec in php
但其中 none 实际上解决了这里提出的问题 - 如何获取在数据库工具中看到的所有行,而不是减少的结果集。
问题出在查询上。一旦我通过更改加入顺序来更改它,一切都会按预期进行。关键是让 DBA.InvoiceItem
成为主要的 table,并将所有内容加入其中。我仍然不知道(清楚)为什么会这样。
这个简单的查询
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 查询的数据库工具)中 运行 时,returns 5 行(发票内容)。一切都以这样一种方式设置,即一张发票可能包含多个具有相同 ID 的商品(但具有不同的价格和采购价格、印刷名称——例如 bucket-white、bucket-blue、bucket-red 等)。每个项目在 Items
table 中都有一个唯一的 ID。上述5行为预期结果(即列表中的商品为实际售出商品)
但是,当查询通过以下方式发送到数据库时:
$result = odbc_exec($conn,$query);
odbc_num_rows($results)
不是 5,如预期和在 DBExplorer 中看到的那样,而是 3 -(感知到的)重复项未 returned(在上一个示例中的所有存储桶中,只有一个是returned).
此外,在使用
遍历结果时while($rowItems = odbc_fetch_object($result) {
...
}
只有 3 次迭代,而不是预期的 5 次。
考虑到列顺序可能会导致问题(我知道这很愚蠢),我将 DBA.InvoiceItem.ID
移到了顶部,使其成为结果集中的第一列。然而,那没有任何作用。
为什么会这样,我怎样才能使它成为 return 完整的结果集?
备注
我知道在 SO 上也有类似的问题:
php odbc_exec not returning all results
why doesn't this code return all rows?
Not getting all rows from a query with odbc_exec in php
但其中 none 实际上解决了这里提出的问题 - 如何获取在数据库工具中看到的所有行,而不是减少的结果集。
问题出在查询上。一旦我通过更改加入顺序来更改它,一切都会按预期进行。关键是让 DBA.InvoiceItem
成为主要的 table,并将所有内容加入其中。我仍然不知道(清楚)为什么会这样。