Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.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
Mysql 连接多个表可以扩展具有重复属性的单行_Mysql_Join_Zend Framework2_Left Join - Fatal编程技术网

Mysql 连接多个表可以扩展具有重复属性的单行

Mysql 连接多个表可以扩展具有重复属性的单行,mysql,join,zend-framework2,left-join,Mysql,Join,Zend Framework2,Left Join,我有5个表需要连接在一起: products: - product_id orders - order_id order_items - item_id - order_id - product_id directsells - directsell_id directsell_items - item_id - directsell_id - product_id 我正在使用Zend Framework,下面是我的代码: $Products

我有5个表需要连接在一起:

products:
  - product_id

orders
  - order_id

order_items
  - item_id
  - order_id
  - product_id

directsells
  - directsell_id

directsell_items
  - item_id
  - directsell_id
  - product_id
我正在使用Zend Framework,下面是我的代码:

    $ProductsTable = new Products();
    $select = $ProductsTable->select();
    $select->from(array('P' => 'products'), array('product_id', 'product_name'));
    $select->setIntegrityCheck(false);

    $select->joinLeft(array('DI' => 'directsells_items'), 'DI.product_id = P.product_id', array('item_price', 'item_discount', 'qty'));
    $select->joinLeft(array('D' => 'directsells'), 'DI.directsell_id = D.directsell_id', array('directsell_number AS invoice_number', 'directsell_date AS invoice_date', 'invoice_status'));
    $select->where('DATE(D.directsell_date) BETWEEN "'. date('Y-m-d', strtotime($from_date)) .'" AND "'. date('Y-m-d', strtotime($to_date)) .'"');
    $select->where('D.invoice_status <> "Canceled"');

    $select->joinLeft(array('OI' => 'order_items'), 'OI.product_id = P.product_id', array('item_price', 'item_discount', 'qty'));
    $select->joinLeft(array('O' => 'orders'), 'OI.order_id = O.order_id', array('order_number AS invoice_number', 'order_date AS invoice_date'
                    ,'IF(`order_status` = "10", "Returned", "Active") AS invoice_status'
                ));
    $select->where('DATE(O.order_date) BETWEEN "'. date('Y-m-d', strtotime($from_date)) .'" AND "'. date('Y-m-d', strtotime($to_date)) .'"');
    $select->where('O.order_status <> "0"');

    $select->where('P.product_id = '. $product_id);
$ProductsTable=新产品();
$select=$ProductsTable->select();
$select->from(数组('P'=>'products')、数组('product\u id','product\u name');
$select->setIntegrityCheck(false);
$select->joinLeft(数组('DI'=>'directsells\u items'),'DI.product\u id=P.product\u id',数组('item\u price','item\u折扣','qty');
$select->joinLeft(数组('D'=>'directsells'),'DI.directsell\u id=D.directsell\u id',数组('directsell\u编号作为发票号','directsell\u日期作为发票日期','invoice\u状态');
$select->where('DATE(D.directsell_DATE)介于“.DATE('Y-m-D',strottime('from_DATE)).”和“.DATE('Y-m-D',strottime('to_DATE))”之间);
$select->where('D.invoice_status“cancelled”);
$select->joinLeft(数组('OI'=>'order\u items'),'OI.product\u id=P.product\u id',数组('item\u price','item\u折扣','qty');
$select->joinLeft(数组('O'=>'orders'),'OI.order\U id=O.order\U id',数组('order\U number作为发票\U number','order\U date作为发票\U date'
,“如果(`order\u status`=“10”,“Returned”,“Active”)作为发票状态”
));
$select->where('DATE(O.order_DATE))介于“'.DATE('Y-m-d',STROTOTIME('from_DATE)).”和“'.DATE('Y-m-d',STROTIME('to_DATE)).”之间;
$select->where('O.order_状态“0”);
$select->where('P.product\U id='.$product\U id');
现在我在
directsell\u items
中有两个条目:

我在
订单项目中有一个条目

查询的结果是来自
directsell\u items
的两个条目与
order\u items
中的一个条目合并,如下所示:


我希望一切都清楚。我知道我的加入可能有问题,但我想不出来。

看起来你的直销商品是一种商品销售,而你的订单商品是第二种商品销售。您只获得两条记录的原因是,当您加入时,您实际上是在扩展行。不查找其他行

正如@Barmar指出的,你需要一个工会来处理这种情况。联合有效地从两个单独的查询中获取记录集,并将它们作为一个记录集返回

因此,您将需要以下内容(未测试的代码):

$ProductsTable=新产品();
$selectDirect=$ProductsTable->select();
$selectDirect->from(数组('P'=>'products')、数组('product\u id','product\u name');
$selectDirect->joinLeft(数组('DI'=>'directseals\u items'),'DI.product\u id=P.product\u id',数组('item\u price','item\u折扣','qty');
$selectDirect->joinLeft(数组('D'=>'directsells'),'DI.directsell\u id=D.directsell\u id',数组('directsell\u编号作为发票号','directsell\u日期作为发票日期','invoice\u状态');
$selectDirect->where('DATE(D.directsell_DATE)介于“.DATE('Y-m-D',strottime('from_DATE)).”和“.DATE('Y-m-D',strottime('to_DATE)).”之间;
$selectDirect->where('D.invoice_status“cancelled”);
$selectDirect->where('P.product\u id='。$product\u id);
$selectOrders=$ProductsTable->select();
$selectOrders->from(数组('P'=>'products')、数组('product\u id','product\u name');
$selectOrders->joinLeft(数组('OI'=>'order\u items'),'OI.product\u id=P.product\u id',数组('item\u price','item\u折扣','qty');
$selectOrders->joinLeft(数组('O'=>'orders'),'OI.order\U id=O.order\U id',数组('order\U number AS invoice\U number','order\U date AS invoice\U date','IF('order\U status`=“10”,“Returned”,“Active”)AS invoice\U status');
$selectOrders->where('DATE(O.order_DATE)介于“'.DATE('Y-m-d',strottime('from_DATE)).”和“'.DATE('Y-m-d',strottime('to_DATE))”之间;
$selectOrders->where('O.order_status“0”);
$selectOrders->where('P.product\u id='.$product\u id');
$select=$db->select()->union(数组($selectDirect,$selectOrders));

看起来您的直销商品是一种商品销售,而您的订单商品是第二种商品销售。您只获得两条记录的原因是,当您加入时,您实际上是在扩展行。不查找其他行

正如@Barmar指出的,你需要一个工会来处理这种情况。联合有效地从两个单独的查询中获取记录集,并将它们作为一个记录集返回

因此,您将需要以下内容(未测试的代码):

$ProductsTable=新产品();
$selectDirect=$ProductsTable->select();
$selectDirect->from(数组('P'=>'products')、数组('product\u id','product\u name');
$selectDirect->joinLeft(数组('DI'=>'directseals\u items'),'DI.product\u id=P.product\u id',数组('item\u price','item\u折扣','qty');
$selectDirect->joinLeft(数组('D'=>'directsells'),'DI.directsell\u id=D.directsell\u id',数组('directsell\u编号作为发票号','directsell\u日期作为发票日期','invoice\u状态');
$selectDirect->where('DATE(D.directsell_DATE)介于“.DATE('Y-m-D',strottime('from_DATE)).”和“.DATE('Y-m-D',strottime('to_DATE)).”之间;
$selectDirect->where('D.invoice_status“cancelled”);
$selectDirect->where('P.product\u id='。$product\u id);
$selectOrders=$ProductsTable->select();
$selectOrders->from(数组('P'=>'products')、数组('product\u id','product\u name');
$selectOrders->joinLeft(数组('OI'=>'order\u items'),'OI.product\u id=P.product\u id',数组('item\u price','item\u折扣','qty');
$selectOrders->joinLeft(数组('O'=>'orders'),'OI.order\U id=O.order\U id',数组('order\U number AS invoice\U number','order\U date AS invoice\U date','IF('order\U status`=“10”,“Returned”,“Active”)AS invoice\U status');
$selectOrders->where('DATE(O.order_DATE)介于“'.DATE('Y-m-d',strottime('from_DATE)).”和“'.DATE('Y-m-d',strottime('to_DATE))”之间;
$selectOrders->where('O.order_status“0”);
$selectOrders->where('P.product
$ProductsTable = new Products();
$selectDirect = $ProductsTable->select();
$selectDirect->from(array('P' => 'products'), array('product_id', 'product_name'));

$selectDirect->joinLeft(array('DI' => 'directsells_items'), 'DI.product_id = P.product_id', array('item_price', 'item_discount', 'qty'));
$selectDirect->joinLeft(array('D' => 'directsells'), 'DI.directsell_id = D.directsell_id', array('directsell_number AS invoice_number', 'directsell_date AS invoice_date', 'invoice_status'));
$selectDirect->where('DATE(D.directsell_date) BETWEEN "'. date('Y-m-d', strtotime($from_date)) .'" AND "'. date('Y-m-d', strtotime($to_date)) .'"');
$selectDirect->where('D.invoice_status <> "Canceled"');
$selectDirect->where('P.product_id = '. $product_id);

$selectOrders = $ProductsTable->select();
$selectOrders->from(array('P' => 'products'), array('product_id', 'product_name'));
$selectOrders->joinLeft(array('OI' => 'order_items'), 'OI.product_id = P.product_id', array('item_price', 'item_discount', 'qty'));
$selectOrders->joinLeft(array('O' => 'orders'), 'OI.order_id = O.order_id', array('order_number AS invoice_number', 'order_date AS invoice_date','IF(`order_status` = "10", "Returned", "Active") AS invoice_status'));
$selectOrders->where('DATE(O.order_date) BETWEEN "'. date('Y-m-d', strtotime($from_date)) .'" AND "'. date('Y-m-d', strtotime($to_date)) .'"');
$selectOrders->where('O.order_status <> "0"');
$selectOrders->where('P.product_id = '. $product_id);

$select = $db->select()->union(array($selectDirect, $selectOrders));