多个内部联接和一对一//一对多关系

时间:2012-12-04 17:11:42

标签: php mysql one-to-many

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

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

$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触发器。

谢谢!

1 个答案:

答案 0 :(得分:1)

我认为你说错了只返回一行。我创建了一个只有查询中使用的列的新模式,用示例数据填充它并获得所有匹配的结果。我认为问题在于您使用mysql_fetch_assoc()函数。 this function的语义很清楚:

  

返回与获取的行对应的字符串关联数组,如果没有其他行,则返回 FALSE

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

鉴于INNER JOIN的语义和您的数据约束,您的查询将始终生成0行或1行。如果您不知道原因 - 请阅读SQL JOIN types & behavior。因此,您有两种方法可以获取有关相关产品的订单详细信息信息:

  1. 使用两个单独的select语句 - 一个用于订单详细信息(始终为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
    }
    
  3. 这是一个品味问题,但我会选择第一个选项 - 它看起来不那么笨拙。