【问题标题】:How properly SELECT several one-to-many rows?如何正确选择几个一对多行?
【发布时间】:2015-05-08 22:25:00
【问题描述】:

我们有 3 张桌子。

1) 订单

PK

order_id

2) Order_Products

PK | FK |专栏 |专栏

order_product_id | order_id |产品编号 |姓名 |数量

3) Order_Product_Components

PK | FK |专栏 |专栏 |专栏

order_product_component_id | order_product_id |股票编号 |姓名 |数量


表 2 和表 3 是一对多的关系。

那么,如果我们想要获得一系列订单产品及其组件,那么我们可以使用的最佳查询是什么?

最后结果应该是这种格式(如果我们只有 1 个产品和 2 个组件):

$products = array(
     array(
    '    'product_id' => x,
         'name'       => x,
         'quantity'   => x,
         'stocks'     => array(
              array(
                   'stock_id' => x,
                   'name'     => x,
                   'quantity' => x),
              array(
                   'stock_id' => x,
                   'name'     => x,
                   'quantity' => x)));

【问题讨论】:

  • 据我所知,MySQL 将返回一个单行数组。我不认为有任何方法可以做一个嵌套数组。您需要通过多个查询检索数据并在代码中构建结果。
  • 仅供参考,您无法通过 1 个查询从 sql 中提取多维数组。订单数据需要 1 个,附加到订单的项目需要 1 个。
  • 我明白这一点。所以我的问题是最好的方法是什么?分组、加入……?
  • 订单是保留字。我们的开端很糟糕。

标签: php mysql sql pdo


【解决方案1】:

由于订单是保留字,我已将订单表名称更改为“订单”。我正在使用 join 来获得预期的结果。我认为 group by 不会像你想要的那样有用。

 $sql= "select * from orders o join order_products op on o.order_id=op.order_id";
    $stmt = $db->prepare($sql);
    $stmt->execute();
    $orders =$stmt->fetchAll();


    foreach($orders as $o){
    $sql= "select stock_id,name,quantity from  order_products op 
           join order_product_components opc on opc.order_product_id=op.order_product_id where op.order_product_id=:orderprodid";
    $stmt = $db->prepare($sql);
    $stmt->execute(array('orderprodid'=>$o['order_product_id']));
    $comps =$stmt->fetchAll();
     $o['stocks']=$comps;
    }

【讨论】:

  • 除非 Kamil 实际上需要其他未指定的数据,否则不需要对 order[s] 表的引用。仅使用WHERE op.order_id 就足够了,并且会减少连接数。
【解决方案2】:

您可能不想执行循环查询,这可能会非常昂贵。

只需查询连接所有表并按产品 ID、产品名称、... 库存 ID、库存名称...排序,然后遍历结果并一次性构建您的数组。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-26
    • 2011-09-14
    • 2012-10-02
    • 1970-01-01
    相关资源
    最近更新 更多