Я бы изменил структуру таблицы валют.Вместо того, чтобы покупать и продавать, у меня было бы что-то вроде
CREATE TABLE currencies
(source_currency
VARCHAR (5) NOT NULL, dest_currency
VARCHAR (5) NOT NULL, value
FLOAT NOT NULL, modified
DATETIME DEFAULT NULL)
И добавить набор фальшивых записей для случаев, когда пользователь хочет одну и ту же валюту (т.е. вставить (EUR, EUR, 1, 1 // 1)/ 1970), (USD, USD, 1/1/1970)
Затем это становится простым (хотя и медленным) запросом
SELECT products.* FROM products INNER JOIN currency ON price_currency = source_currency WHERE price_min <= price * value AND price * value <= price_max AND dest_currency = desired_currency.
Поскольку умножение не может быть оптимизировано, онобудет полное сканирование таблицы. Другой альтернативой является денормализация таблицы продуктов, чтобы иметь цену в каждой возможной валюте, поэтому при обновлении валют вы пересчитываете цены. Затем поиск выполняется тривиально (полностью индексируется) И вы можете установить разностьцены (а-ля apple), которые вы обновляете вручную. Кроме того, если вы используете http://en.wikipedia.org/wiki/ISO_4217, вам нужен только VARCHAR (3), а не 5