Mysql查询同时过滤两种或多种产品货币

时间:2011-11-02 22:27:23

标签: mysql sql

我有两个名为产品和货币的表

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 :(得分:0)

我会更改currency表的结构。我没有买入和卖出价值,而是拥有像

这样的东西

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. 

由于无法优化乘法,因此将进行全表扫描。 另一种方法是对产品表进行非规范化,以便以各种可能的货币计算价格,因此当您更新货币时,您需要重新计算价格。然后搜索是微不足道的(完全索引)并且您可以建立您手动更新的差价(la apple)。 此外,如果您使用http://en.wikipedia.org/wiki/ISO_4217,则只需要VARCHAR(3),而不是5