2014-09-08 3 views
0

У меня есть две таблицы:Преобразование валюты в MySQL с помощью объединения

currency стол (на основе USD), который постоянно обновляется:

+----+----------+-----------+ 
| id | currency | value_usd | 
+----+----------+-----------+ 
| 1 | USD  | 1   | 
| 2 | AUD  | 1.077315 | 
| 3 | GBP  | 0.620868 | 
| 4 | EUR  | 0.775338 | 
+----+----------+-----------+ 

И у меня есть order таблицу, где новые заказы

+----+-------------+----------+ 
| id | sales_total | currency | 
+----+-------------+----------+ 
| 1 | 100   | USD  | 
| 2 | 50   | GBP  | 
| 3 | 75   | EUR  | 
| 4 | 60   | GBP  | 
+----+-------------+----------+ 

У меня есть валюта, которая диктует тип валюты, который мне нужен выводить итоговые значения, даже если все заказы хранятся в разных валютах.

Например, если $currency = 'EUR'; все суммы должны быть в EUR при запросе таблицы order, основанной на ставках в таблице currency. Например:

+----+-------------+----------+-----------------+ 
| id | sales_total | currency | converted_total | 
+----+-------------+----------+-----------------+ 
| 1 | 100   | USD  | 77.53   | 
| 2 | 50   | GBP  | 62.44   | 
| 3 | 75   | EUR  | 75.00   | 
| 4 | 60   | GBP  | 74.92   | 
+----+-------------+----------+-----------------+ 

Как это сделать? Я предполагаю, что мне нужно какое-то заявление CASE?

+0

Там что-то не так с этим требованием. Конверсии валют действительны только при фактическом выполнении обмена валют, например. в банке. В остальное время вы просто кормите дезинформацию для пользователя. Вы должны иметь дело либо с валютой гордости за предмет, который вы продаете, либо за валюту, которую пользователь будет использовать при оплате. Это проблема бизнес-требований, а не проблема программирования. – EJP

ответ

1

Это Oughta сделать:

SELECT o.*, sales_total * (c2.value_usd/c1.value_usd) as converted_total, 
     c2.currency as converted_currency 
FROM `order` o 
JOIN `currency` c1 ON o.currency = c1.currency 
JOIN `currency` c2 ON c2.currency = 'EUR' 

Трудно проверить без образца БД, хотя - расчет может быть выключен, но принцип ясен.

+0

Кажется, хорошо работает! Всего несколько изменений. Первое соединение должно быть «o.currency = c1.currency», а второе должно быть «c2.currency =« EUR ». Благодаря! –

+0

Ой, да, исправлено :) –

1

фактор для вывода валюты вы можете получить с Sub-SELECT и остальным, что вы делаете, вступив в таблицах на валюту:

SELECT 
    t2.id AS id, 
    t2.sales_total AS sales_total, 
    t2.currency AS currency, 
    (t2.sales_total/value_usd * (SELECT value_usd FROM t1 WHERE currency = 'EUR')) AS converted_total 
FROM t2 JOIN t1 
    ON t1.currency = t2.currency 
+0

Я не тестировал этот, но, полагая, что он работает, я считаю, что он будет медленнее, чем Нильс. Я ценю это. –

+1

С одной стороны у моего решения есть подзапрос, но это нужно оценивать только один раз, с другой стороны у Niels есть еще один JOIN. Я просто тестировал несколько выборочных данных (записи 90 тыс.). Шахта была немного быстрее: ~ 4.9 против ~ 5.4 сек. – JHoffmann

+0

В этом случае я стою исправленным. Единственное отличие, которое я вижу, это то, что если «EUR» не существует в 't1', он вернет строку с NULL. Пока с кодом Нильса, строки будут ** не возвращаться **. –

Смежные вопросы