0

我在下面有这个查询。表的所有关系都是一对一的关系,除了 ASSOCPRODUCTS 表,每个订单有两个产品。一切似乎都工作正常,除了我的查询只返回一行,因此,实际上只有两个产品 ID 时才会返回一个产品 ID。我理解为什么它只拉一个,因为每个 orderID 只有一个订单,但每个合同有两个关联产品,我需要获取每个产品 ID。在 Assocproducts 表中,每个产品都有自己的行,因为它与contracts 表是一对多的。

是否可以使用内部联接获取该信息,或者我是否需要运行另一个查询?

$orderid = $_POST['orderid'];

$res = mysql_query ("
SELECT company.name as cname, 
    orders.datemade as datemade
    orders.p1quantity as p1q, 
    orders.p2quantity as p2q, 
    assocproducts.productid as pid,
    assocproducts.price as pprice, 
    inventory.name as pname, 
    inventory.quantity as pquantity 
FROM orders 
INNER JOIN contracts ON (contracts.id = orders.contractid)
INNER JOIN company ON (contracts.companyid = company.id) 
INNER JOIN assocproducts ON (contracts.id = assocproducts.contractid) 
INNER JOIN inventory ON (assocproducts.productid = inventory.id) 
WHERE orders.id = " . $orderid);

$order = mysql_fetch_assoc($res);

如果我需要提供更多信息,请告诉我。

$order 不在循环中,因为我只需要显示此特定订单的订单信息。这是点击时的 AJAX 触发器。

谢谢!

4

1 回答 1

1

我认为您说只返回一行是错误的。我创建了一个新模式,其中仅包含查询中使用的列,用示例数据填充它并得到所有匹配的结果。我认为问题在于您对mysql_fetch_assoc()功能的使用。这个函数的语义很清楚:

返回与获取的行相对应的字符串关联数组,如果没有更多行,则返回FALSE 。

所以我的猜测是你再也不会打电话mysql_fetch_assoc()了。

给定语义INNER JOIN和数据约束,您的查询将始终产生 0 或 1 行。如果您不知道为什么 - 请阅读SQL JOIN types & behavior。因此,您有两种选择来获取订单详细信息相关产品的信息:

  1. 使用两个单独的选择语句 - 一个用于订单详细信息(始终为 1 行),第二个用于关联产品(2 行)。迭代第二个查询的结果 - 您将获得有关获取的每一行的一个产品的信息。
  2. 保留现有查询,但通过迭代所有行来更改从中检索数据的方式(请注意,订单信息将出现在所有获取的行中,并且对所有行都相同):

    $firstRow = true;
    while (($order_product = mysql_fetch_assoc($res)) !== FALSE) {
        if ($firstRow) {
            // do something with order info
            // but don't repeat it for consecutive rows
            $firstRow = false;
        }
        // do something with currently fetched associated product info
    }
    

这是一个品味问题,但我会选择第一个选项 - 它看起来不那么老套。

于 2012-12-04T23:28:35.017 回答