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

时间:2012-07-23 14:50:49

标签: mysql distinct

下表将存储不同货币之间的汇率:

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_from currency_to 组合列为不同的汇率,然后找到具有最新日期的汇率。

例如,假设我的数据为:

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 - 作为货币2和1之间的最新汇率
  • 4 - 作为货币1和3之间的最新汇率

2 个答案:

答案 0 :(得分:1)

以下查询应该有效:

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是为了避免使用可能非常昂贵的子查询,如果你有大型数据集。它基本上是在寻找没有“更新”记录的记录。

或者,您可以选择更简单的方法(尽管可能(或可能不会,如评论中所述)更慢):

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 :(得分:0)

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

SELECT id FROM currency_exchange WHERE currency_from='$currency_from' AND currency_to='$currency_to' ORDER BY ABS( DATEDIFF( exchange_date, now() ) ) LIMIT 1