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

时间:2017-09-14 15:42:04

标签: mysql sql

这是我的数据库架构:

付款表:

+------------+--------+--------+---------------------+
| 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;

实际结果:
如下所示service_charge来自tab_id = 2两次(payment_id = 2payment_id = 3)。{/ p>

+------------+-----------------+---------------------+
| 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_charge中加入payment_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 |
+------------+-----------------+---------------------+

1 个答案:

答案 0 :(得分:1)

您应该确定哪个是与tab_id匹配的第一笔付款,然后根据该信息决定是否要使用service_charge:

SELECT
  payment.payment_id,
  payment.amount + if (payment.created=m.mintime, tab.service_charge, 0) as total_amount,
  payment.created
FROM payment
  INNER JOIN tab
    ON payment.tab_id = tab.tab_id
  JOIN (
    SELECT tab_id, min(created) as 'mintime'
    FROM payment
    GROUP BY tab_id
  ) AS m on m.tab_id = payment.tab_id;