带有LEFT JOIN的MySQL查询,其中第二个表具有2部分主键

时间:2017-05-22 20:14:26

标签: mysql join left-join primary-key composite-primary-key

我在MySQL数据库(storeskus)中有2个表。第一个是FBM_Orders,第二个是IM_INV

我正在尝试查询

SELECT `FBM_Orders`.`order-id`,`FBM_Orders`.`order-item-id`,`FBM_Orders`.`purchase-date`,
       `FBM_Orders`.`promise-date`,`FBM_Orders`.`buyer-name`,`FBM_Orders`.`sku`,
       `FBM_Orders`.`product-name`,`FBM_Orders`.`quantity-purchased`,
       `FBM_Orders`.`recipient-name`,`IM_INV`.`LOC_ID`,`IM_INV`.`QTY_ON_HND`
FROM `FBM_Orders` 
LEFT JOIN `IM_INV` ON `FBM_Orders`.`sku` = `IM_INV`.`ITEM_NO`
WHERE `FBM_Orders`.`quantity-to-ship` > 0
ORDER BY `FBM_Orders`.`purchase-date`, `IM_INV`.`LOC_ID` ASC;

因为IM_INV表格包含两部分主键:ITEM_NO& LOC_ID,对于每个ITEM_NO,我为4个地点(QTY_ON_HND)中的每一个LOC_ID获得4行。

我对SQL很陌生,所以我很高兴能够做到这一点,但我怎样才能使每个ITEM_NO的结果为一行,但每个{{1}都有一列1}}及其LOC_ID

示例:

我目前的结果是

QTY_ON_HND

如何将其更改为

FBM_Order.sku    FBM_Order.quantity-purchased    IM_INV.LOC_ID    QTY_ON_HND
'SCHO645256'     1                               AF               2
'SCHO645256'     1                               LO               2
'SCHO645256'     1                               S                3
'SCHO645256'     1                               SL               1

谢谢!

1 个答案:

答案 0 :(得分:2)

您可以按照自己的方式加载它并在应用程序中对其进行处理,但如果您真的想在MySQL内部进行处理,请尝试使用GROUP CONCAT和JSON,如下所示:

SELECT
  GROUP_CONCAT(JSON_OBJECT(
    'LOC_ID', IM_INV.LOC_ID,
    'QTY_ON_HND', QTY_ON_HND
  ))
  {another fields}
FROM `FBM_Orders` 
LEFT JOIN `IM_INV` ON `FBM_Orders`.`sku` = `IM_INV`.`ITEM_NO`
WHERE `FBM_Orders`.`quantity-to-ship` > 0
GROUP BY `FBM_Orders`.`order-id`;

注意:JSON仅适用于MySQL 5.7+,可能会减慢您的查询速度。您仍然需要将数据转换为应用程序内的数组。所以它在你的应用程序中完成了一半,在数据库中完成了一半。