2011-11-02 40 views
0

我有一個名爲產品和貨幣MySQL查詢過濾產品兩個或兩個以上的貨幣在同一時間

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

將所有價格設置爲相同貨幣並僅爲顯示目的進行貨幣轉換會簡單很多。 – Xint0

回答

0

我會改變貨幣表的結構。而不是買入和賣出價值的,我有這樣的事情

CREATE TABLE currenciessource_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. 

由於乘法不能優化,它將成爲一個全表掃描。 另一種替代方法是對產品表進行非規格化處理,以各種可能的貨幣來計算價格,因此當您更新貨幣時,您需要重新計算價格。然後搜索是微不足道的(完全索引),你可以建立你手動更新的差價(蘋果)。 此外,如果您使用的是http://en.wikipedia.org/wiki/ISO_4217,則只需要VARCHAR(3),而不是5

+0

感謝您的回答,這對我的應用程序非常有幫助。 –