0

次の表は、さまざまな通貨間の為替レートを経時的に保存します。

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 の間の最新のレートとして
4

2 に答える 2

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

self- を行う秘訣は、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
于 2012-07-23T14:55:49.350 に答える
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 
于 2012-07-23T14:56:48.040 に答える