Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何正确选择多个一对多行?_Php_Mysql_Sql_Pdo - Fatal编程技术网

Php 如何正确选择多个一对多行?

Php 如何正确选择多个一对多行?,php,mysql,sql,pdo,Php,Mysql,Sql,Pdo,我们有三张桌子 1) 订单 主键 订单号 2) 订购产品 PK | FK |列|列 订单(产品)标识|订单|标识|产品|标识|名称|数量 3) 订购产品组件 PK | FK |列|列|列 订单(产品)零部件|订单(产品)标识|库存|标识|名称|数量 表2和表3具有一对多关系 因此,如果我们想要获得一系列订单产品及其组件,那么我们可以使用的最佳查询是什么 最后,结果应该是这种格式(如果我们只有一个产品和两个组件): 由于order是一个保留字,我已将order表名称更改为“orders”。我正在

我们有三张桌子

1) 订单

主键

订单号

2) 订购产品

PK | FK |列|列

订单(产品)标识|订单|标识|产品|标识|名称|数量

3) 订购产品组件

PK | FK |列|列|列

订单(产品)零部件|订单(产品)标识|库存|标识|名称|数量


表2和表3具有一对多关系

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

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


由于order是一个保留字,我已将order表名称更改为“orders”。我正在使用join来获得预期的结果。我认为按你想要的方式分组是没有用的

 $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;
    }

您可能不希望执行查询循环,这可能非常昂贵


只需按产品id、产品名称等将所有表和订单连接起来即可。。。股票id,股票名称,。。。然后在结果中循环并一次性构建数组

据我所知,MySQL将返回一行数组。我认为没有任何方法可以实现嵌套数组。您需要通过多个查询检索数据,并在代码中生成结果。仅供参考,您不能通过一个查询从sql中提取多维数组。您需要1个用于订单数据,1个用于订单附带的项目。我理解这一点。所以我的问题是什么是最好的方法?分组、加入?顺序是一个保留字。我们的起点不好。除非Kamil确实需要来自它的其他未指定数据,否则不需要对
order[s]
表的引用。只要使用
WHERE op.order_id
就足够了,可以减少连接的数量。
 $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;
    }