Mysql-запрос для фильтрации двух или более валют продуктов одновременно - PullRequest
0 голосов
/ 03 ноября 2011

У меня есть две таблицы с именами продуктов и валют

CREATE TABLE `products` (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `product_name` VARCHAR(15) DEFAULT NULL,
  `price` INT DEFAULT NULL,
  `price_currency` VARCHAR(5) DEFAULT NULL,
  PRIMARY KEY  (`id`)
)

CREATE TABLE `currencies` (
  `currency_name` VARCHAR(5) DEFAULT NULL,
  `buy_value` FLOAT DEFAULT NULL,
  `sell_value` FLOAT DEFAULT NULL,
  `modified` DATETIME DEFAULT NULL
)

У меня есть несколько записей в таблице продуктов, в которых указаны цены в долларах США, в других - цены в евро. У меня также есть таблица валют, которая хранится в долларах США, евро и т. Д. покупать и продавать ценности. Когда посетитель вводит цены в долларах США, чтобы отфильтровать все товары с помощью формы поиска, запрос должен проверять продукты, которые имеют цены в евро одновременно.

Итак, как я могу это сделать?

1 Ответ

0 голосов
/ 03 ноября 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...