从数据库中选择多个货币代码的最新汇率的最佳方式

Posted

技术标签:

【中文标题】从数据库中选择多个货币代码的最新汇率的最佳方式【英文标题】:The best way to select the latest rates for several currency codes from the DB 【发布时间】:2012-06-21 09:44:01 【问题描述】:

全部!我有以下问题:我有 2 个简单的表。第一个,比如“货币”,存储有关货币的信息(ISO 4217 代码 (PK)、名称等)。第二个,“rates”,有以下字段:id、currency_code(参考货币.code)、date_added(日期时间)、rate。

我想要的是选择几个货币代码的最新汇率。首先,我想这样做:

SELECT r.rate
FROM rates r
WHERE r.id IN (SELECT id
               FROM rates r1
               WHERE r1.currency_code IN('USD', 'EUR')
               GROUP BY r1.currency_code
               ORDER BY r1.date_added DESC)
ORDER BY r.currency_code ASC

但我很快就想起了 ORDER 子句将在结果分组后被考虑在内。就我而言,子查询最终返回了最早费率的 id...

我想我可以分别获取每个货币代码的汇率,但我仍然希望能够使用一个干净的查询。

【问题讨论】:

如何在内部查询中获取最新的日期和货币代码,然后在外部查询中使用IN? 【参考方案1】:

假设最新汇率是您可以使用的最高 id 汇率:

SELECT *
FROM rates r
WHERE r.id IN (
    SELECT MAX(r1.id)
    FROM rates r1
    GROUP BY r1.currency_code
) T;

但我强烈建议另一种我喜欢的模式。我今天早上在another answer解释了它:

SELECT
  c.*,
  r1.*
FROM currency c
INNER JOIN rates r1 ON c.code = r1.currency_code
LEFT JOIN rates r2 ON r1.currency_code = r2.currency_code AND r2.id > r1.id
WHERE r2.id IS NULL;

【讨论】:

非常感谢!我已经完全忘记了这个技巧(而且我一开始就记不太清了)。

以上是关于从数据库中选择多个货币代码的最新汇率的最佳方式的主要内容,如果未能解决你的问题,请参考以下文章

php里实现汇率转换

在哪里以及如何存储货币汇率?

贝宝和货币汇率

汇总字段介绍以及在汇率变化后货币数据类型的汇总字段怎么变的实践研究

MySQL中货币汇率的理想数据类型

根据货币和日期选择汇率[关闭]