我有两个名为产品和货币的表
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
)
我在产品表中有一些有美元价格的记录,有些则有欧元价格。我还有货币表,存储有美元,欧元等。买卖价值。当访问者输入美元价格以使用搜索表单过滤所有产品时,查询必须同时检查具有欧元价格值的产品。
那么,我该怎么做?
答案 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