MySQL - 一对多连接 - 从“一个”表中仅返回 1 行的结果

Posted

技术标签:

【中文标题】MySQL - 一对多连接 - 从“一个”表中仅返回 1 行的结果【英文标题】:MySQL - One to Many Join - Return results for only 1 row from "One" table 【发布时间】:2015-10-09 21:47:02 【问题描述】:

对不起....应该说,这是 mysql

好吧....首先,我不知道我是否真的可以做我想做的事。我有一些使用 SQL 的经验,但不是很多。希望有人可以提供帮助。

我有两张桌子,一张有订单,一张有发货。我可以在它们之间进行连接并获得正确的结果.....

订单表

Order_ID |  Revenue  |
1001     |  125.00   |
1002     |  215.31   |
1003     |  654.43   |

发货表

Order_ID | Shipment_ID |  Item Count  |
1001     |    99001    |      25      |
1001     |    99002    |       5      |
1002     |    99003    |      65      |
1003     |    99004    |     123      | 
1003     |    99005    |      20      |

通过 Order_ID 上的直接连接,我得到了预期的结果:

Order_ID | Revenue  | Shipment_ID |  Item Count  |
1001     |  125.00  |   99001     |      25      |
1001     |  125.00  |   99002     |       5      |
1002     |  215.31  |   99003     |      65      |
1003     |  654.43  |   99004     |     123      | 
1003     |  654.43  |   99005     |      20      |

如果可能的话,我正在尝试在相同的输出中协调收入和成本。我从一张单独的表格中知道我每批货物的成本是多少,所以数学很简单。但是,我的收入是这样的,因为我的收入列中有重复,因为订单要分多次发货。

我想得到类似以下的东西:

Order_ID | Revenue  | Shipment_ID |  Item Count  |
1001     |  125.00  |   99001     |      25      |
1001     |  NULL    |   99002     |       5      |
1002     |  215.31  |   99003     |      65      |
1003     |  654.43  |   99004     |     123      | 
1003     |  NULL    |   99005     |      20      |

重复收入数字的值可以是空值、空白、0,以及将计算的值以外的任何值。有任何想法吗?

提前致谢!

马修

【问题讨论】:

您使用的是哪个 RDBMS,MySQL,SQL Server,...? 您的成本栏在哪里?除非您需要详细的装运输出,否则您可能会创建一个每个订单一行的输出,并将装运成本相加。 【参考方案1】:

在 MySQL 中,您可以使用以下查询:

SELECT s1.Order_ID, s1.Shipment_ID, s1.Item_Count, 
       IF(s1.Shipment_ID = s2.minS_ID, o.Revenue, 0) AS Revenue
FROM Shipments AS s1
INNER JOIN (
   SELECT Order_ID, MIN(Shipment_ID) AS minS_ID
   FROM Shipments
   GROUP BY Order_ID
) AS s2 ON s1.Order_ID = s2.Order_ID
INNER JOIN Orders AS o ON s1.Order_ID = o.Order_ID

我们的想法是对包含最小Shipment_ID 每个Order_ID 的派生表执行附加连接。如果当前行的Shipment_ID值等于这个值则返回Revenue,否则返回0。

Demo here

在 SQL Server 中,您可以使用窗口版本的MIN 进行比较:

SELECT s.Order_ID, Shipment_ID, Item_Count,
       CASE 
          WHEN MIN(Shipment_ID) OVER (PARTITION BY s.Order_ID) = Shipment_ID THEN Revenue
          ELSE 0
       END AS Revenue            
FROM Shipments AS s
INNER JOIN Orders AS o ON s.Order_ID = o.Order_ID

【讨论】:

以上是关于MySQL - 一对多连接 - 从“一个”表中仅返回 1 行的结果的主要内容,如果未能解决你的问题,请参考以下文章

如何从mysql数据库表中仅获取php数组的匹配项[重复]

Access 2010 中 1:M Join 的左表中仅显示唯一记录

如何从 MySQL 的 DATETIME 字段中仅选择日期?

mysql多对多

mysql多对多

LINQ 如何在一对多连接中指定选择某些列