首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL -针对一系列列选择不同的值

MySQL -针对一系列列选择不同的值
EN

Stack Overflow用户
提问于 2012-07-23 14:50:49
回答 2查看 816关注 0票数 0

下表将保存不同货币之间的汇率随时间的变化:

代码语言:javascript
复制
CREATE TABLE `currency_exchange` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `currency_from` int(11) DEFAULT NULL,
 `currency_to` int(11) DEFAULT NULL,
 `rate_in` decimal(12,4) DEFAULT NULL,
 `rate_out` decimal(12,4) DEFAULT NULL,
 `exchange_date` datetime DEFAULT NULL,
 PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

我将如何查询它以获取最新汇率的列表?

它本质上是将合并的currency_fromcurrency_to列识别为不同的汇率,然后找到最近日期的列。

例如,假设我获得的数据如下:

代码语言:javascript
复制
INSERT INTO currency_exchange (id, currency_from, currency_to, rate_in, rate_out, exchange_date) VALUES
(1, 1, 2, 0.234, 1.789, '2012-07-23 09:24:34'),
(2, 2, 1, 0.234, 1.789, '2012-07-24 09:24:34'),
(3, 2, 1, 0.234, 1.789, '2012-07-24 09:24:35'),
(4, 1, 3, 0.234, 1.789, '2012-07-24 09:24:34');

我希望它选择行ID:

  • 1-作为1和2货币之间的最新汇率
  • 3-货币与货币之间的最新汇率
  • 4-作为1和3货币之间的最新汇率
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-23 14:55:49

以下查询应该可以工作:

代码语言:javascript
复制
SELECT ce.*
FROM currency_exhcnage ce
LEFT JOIN currency_exchange newer
    ON (newer.currency_from = ce.currency_from
    AND newer.currency_to = ce.currency_to
    AND newer.exchange_date > ce.exchange_date)
WHERE newer.id IS NULL

执行自LEFT JOIN的诀窍是避免求助于子查询,如果您有大型数据集,那么子查询可能会非常昂贵。它本质上是在寻找不存在“更新”记录的记录。

或者,您可以选择更简单的方法(尽管它可能(或者不像注释中提到的那样)更慢):

代码语言:javascript
复制
SELECT *
FROM currency_exchange ce
NATURAL JOIN (
    SELECT currency_from, currency_to, MAX(exchange_date) AS exchange_date
    FROM currency_exchange
    GROUP BY currency_from, currency_to
) AS most_recent
票数 1
EN

Stack Overflow用户

发布于 2012-07-23 14:56:48

在动态查询中插入$currency_from和$currency_to的值。下面的查询将返回最近的行到当前时间。

代码语言:javascript
复制
SELECT id FROM currency_exchange WHERE currency_from='$currency_from' AND currency_to='$currency_to' ORDER BY ABS( DATEDIFF( exchange_date, now() ) ) LIMIT 1 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11614966

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档