如何从MySQL中的另一个表中只选择第一个匹配值?
以下是我的数据库架构: 付款表:如何从MySQL中的另一个表中只选择第一个匹配值?,mysql,sql,Mysql,Sql,以下是我的数据库架构: 付款表: +------------+--------+--------+---------------------+ | payment_id | tab_id | amount | created | +------------+--------+--------+---------------------+ | 1 | 1 | 5 | 2017-05-22 12:14:27 | | 2
+------------+--------+--------+---------------------+
| 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 |
+------------+----------------+
我需要计算每次付款的总金额+服务费,但服务费应仅包含在第一次付款匹配选项卡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;
实际结果:
正如您在下面看到的,从选项卡2收取的服务费包括两次付款和两次付款
预期结果:
总金额不应包括付款中的服务费,如下图所示
+------------+-----------------+---------------------+
| 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 |
+------------+-----------------+---------------------+
您应该确定与tab_id匹配的第一笔付款,然后根据该信息决定是否使用服务费:
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;
请看:@草莓我看了一下,但我仍然不清楚这个话题如何帮助我解决我遇到的问题。请阅读已被提升106次的公认答案。按照简单的说明操作。看看会发生什么,谢谢。朴素典雅。
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;