Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从MySQL中的另一个表中只选择第一个匹配值?_Mysql_Sql - Fatal编程技术网

如何从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;