如何从MySQL中的另一个表中只选择第一个匹配值?

问题描述:

这里是我的数据库架构:如何从MySQL中的另一个表中只选择第一个匹配值?

付款表:

+------------+--------+--------+---------------------+ 
| payment_id | tab_id | amount | created    | 
+------------+--------+--------+---------------------+ 
| 1   | 1  | 5  | 2017-05-22 12:14:27 | 
| 2   | 2  | 10 | 2017-05-22 12:15:21 | 
| 3   | 2  | 1  | 2017-05-22 13:11:14 | 
+------------+--------+--------+---------------------+ 

卡表:

+------------+----------------+ 
| tab_id  | service_charge | 
+------------+----------------+ 
| 1   | 1    | 
| 2   | 3    | 
+------------+----------------+ 

我需要计算每支付总金额(amount + service_charge),但service_charge应仅包含在匹配tab_id的第一笔付款中。

我当前的查询:

SELECT 
    payment.payment_id, 
    (payment.amount + tab.service_charge) as total_amount, 
    payment.created 
FROM payment 
    INNER JOIN tab 
    ON payment.tab_id = tab.tab_id; 

实际结果:
正如你可以看到下面从tab_id = 2service_charge包括两次(payment_id = 2payment_id = 3)。

+------------+-----------------+---------------------+ 
| payment_id | total_amount | created    | 
+------------+-----------------+---------------------+ 
| 1   | 6    | 2017-05-22 12:14:27 | 
| 2   | 13    | 2017-05-22 12:15:21 | 
| 3   | 4    | 2017-05-22 13:11:14 | 
+------------+-----------------+---------------------+ 

预期结果:如下所示
total_amount不应包括在service_chargepayment_id = 3

+------------+-----------------+---------------------+ 
| payment_id | total_amount | created    | 
+------------+-----------------+---------------------+ 
| 1   | 6    | 2017-05-22 12:14:27 | 
| 2   | 13    | 2017-05-22 12:15:21 | 
| 3   | 1    | 2017-05-22 13:11:14 | 
+------------+-----------------+---------------------+ 
+0

见:我为什么要提供MCVE对于我来说似乎是一个非常简单的SQL查询?](https://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-我想成为一个非常简单的sql查询) – Strawberry

+0

@Strawberry我看了一下,但它仍然不清楚这个话题可以帮助我解决我遇到的问题。 –

+0

阅读已接受的答案(已提高106次)。遵循简单的指示。看看会发生什么。 – Strawberry

您应该确定这是首付款匹配tab_id,然后根据这些信息,决定是否要使用service_charge与否:

+0

谢谢。简单而优雅。 –