Сортировка по мультивалютному полю

DJ_Petrovich

Новичок
Сортировка по мультивалютному полю

Есть два поля: price и exch
В первом цена, во втором код валюты

Трубется отсортировать по возрастанию цены в одной валюте.
Т.е. нужно определить код валюты, и если он отличается от базовой, то умножить на курс. А затем уже отсортировать по полученным значениям.
Валют всего три.


Кто ни будь сталкивался с таким? Подскажите, куда копать
 

baev

‹°°¬•
Команда форума
напрямую относится: просто отсортируйте по результатам умножения
 

DJ_Petrovich

Новичок
:)
это ясно
хотелось бы конструкцию запроса понять

-~{}~ 05.02.07 00:05:

Объясню еще разочек.

Таблица такая:
price | exch
---------------------
280 | 1
653 | 3
343 | 2
876 | 3
987 | 1

где 1 - доллары США, 2 - ЕВРО, 3 - рубли
нужно отсортировать по долларам при курсах
1 доллар = 26,5 рублей
1 доллар = 34 евро

Запрос типа select price from table order by (price*exch)
тут явно не подходит
 

chira

Новичок
DJ_Petrovich

создай дополнительное поле для конкретной (default) валюты, например рублей и раситывай его значение при редактировании данных.
выборку будешь сортировать по этому полю.
это денормализация данных, но этого не нужно всегда бояться ... :)
 

voituk

прозревший
chira
Мне кажется не лучшая идея - курс валют меняется довольно часто.
 

bubblegum

Новичок
курсы валют в отдельную таблицу
id name koeff
1 rur 1
2 usd 26
3 eur 34
в вычисляемом поле умножать табла1.цена*табла_валют.курс, по нему сортировать
 

hermit_refined

Отшельник
voituk
смотря что у автора происходит.
если товаров много (и выборка, конечно, постраничная) - нужен индекс. а значит - дополнительное поле (обновлять его иногда никто не мешает).
 

chira

Новичок
voituk

курсы не меняются за прошедшие дни
курс валют меняется довольно часто
а текущий курс по-любому нужно знать, иначе можешь ничего не заработать :)
ты расшифруй, что такое "меняется довольно часто" - это завтра он будет отличатся от сегоднешнего, а послезавтра будет отличаться от завтрашнего, но курс за прошедшие дни останется ...
 

DJ_Petrovich

Новичок
Сделал так:

select * from table order by (select case exch when "2" then price*kurs_euro when "3" then price*kurs_rub else price end) desc

курсы записаны в таблицу и берутся раз в сутки по крону с сайта ЦБ

Только вот проблемка:
написано что "CASE was added in MySQL 3.23.3", а на самом деле, видимо, с 4.1.0 , т.к. на 4.1.0 работает, а на 4.0.25 - не работает :(

хотя оно ругается, как я понял, на подзапрос, как таковой, а не на сам CASE.
блин. как выйти из положения, кто подскажет?
 

baev

‹°°¬•
Команда форума
Тут подзапрос и не нужен.
Что-то вроде:

Код:
 select price, exch, 
(case exch when "2" then price*kurs_euro when "3" then price*kurs_rub else price end) AS sort 
from table 
order by sort  desc
 

alexcrown

Новичок
Если допустить, что курсы хранятся в таблице rate_table c полями val_id -- идентификатор валюты и rate -- её курс к базовой валюте, то запрос будет примерно таким:
Код:
select price
  from price_table p JOIN rate_table r ON p.exch = r.val_id
  order by price*rate
 
Сверху