2012-06-03 21 views
2

我有3個表如下,Mysql的從3個表得到最低的價格。提高效率

1. Link_products_price 
DESC: unique_id|product_id|sub_category_id. 
2. local_price 
DESC: unique_id|price. 
3. online_price 
DESC: unique_id|price. 

我想選擇最低的價格對於一個給定的product_id | sub_category_id。

我想出了下面,

方法1:

SELECT MIN(price) 
FROM local_price 
WHERE unique_id IN (SELECT unique_id 
        FROM link_products_price 
        WHERE product_id=1 
        AND sub_category_id=1) 

UNION 

SELECT MIN(price) 
FROM online_price 
WHERE unique_id IN (SELECT unique_id 
        FROM link_products_price 
        WHERE product_id=1 
        AND sub_category_id=1) 
LIMIT 1; 

方法2:

與內創建一個視圖JOIN這3個表和查詢MIN(價格)從該視圖在應用程序中是必需的。

不過,鑑於只會在運行時執行查詢。

請告訴我方法1查詢是否完成,如果它可以在VIEW方法來進一步優化和建議了。

回答

3

您的第一種方法始終選擇最低的當地價格:您需要添加ORDER BY子句以確保LIMIT選擇最小值。然而,這將是簡單join查詢並結合MIN()聚集使用MySQL的LEAST()功能:

SELECT LEAST(MIN(local_price.price), MIN(online_price.price)) 
FROM link_products_price 
    LEFT JOIN local_price USING (unique_id) 
    LEFT JOIN online_price USING (unique_id) 
WHERE link_products_price.product_id = 1 
    AND link_products_price.sub_category_id = 1 
+0

謝謝爲答覆。我可以禮貌地請求你向我解釋這個查詢中的好東西嗎?在某種程度上,我瞭解左連接在這種情況下的必要性。而不是盲目地複製和粘貼我想知道的查詢,爲什麼?因爲下次我會自己寫。再次感謝。 – beck03076

+0

@ beck03076:外連接是僅需要(相對於內的)的情況下有在價格表中沒有匹配的記錄;雖然這麼說,在這種情況下'LEAST()'會導致'NULL'值,外連接實際上並不增加多少在這裏的所有,你可以簡單地處置'LEFT'關鍵字。 PS,我的答案中的單詞「join」是鏈接到一個很好的關於連接的教程。 – eggyal

+0

非常感謝你。 – beck03076

2

在效率(不可讀性)方面我可能會類似於您的第一個例子中的東西去,除了您的示例中包含錯誤 - 您認爲UNION對結果進行排序?

試試這個修改後的版本,而不是:

SELECT LEAST(

    (SELECT MIN(price) 
    FROM local_price 
    WHERE unique_id IN (SELECT unique_id 
         FROM link_products_price 
         WHERE product_id=1 
         AND sub_category_id=1)) 
    , 
    (SELECT MIN(price) 
    FROM online_price 
    WHERE unique_id IN (SELECT unique_id 
         FROM link_products_price 
         WHERE product_id=1 
         AND sub_category_id=1)) 
) 

但是,除非你有數億行的,你可能會發現,查詢去那麼快,即使你使用它不是一個低效率的方法這是最快的事情。

獲得效率最重要的是確保您有合適的索引

我建議加入以下指標:

  • link_products_price(產品,sub_category_id)
  • local_price(UNIQUE_ID,價格)
  • online_price(UNIQUE_ID,價格)
+0

我聽說連接速度快於子查詢。我可以基準你的答案和eggyal的答案嗎?基準mysql查詢的最佳方式是什麼?非常感謝你的回答。 – beck03076

+1

@ beck03076:「我聽說連接速度快於子查詢。」有時候,但這並不意味着它總是如此。 「我可以基準你的答案和eggyal的答案嗎?」我不知道!我知道*我*可以,但我不知道你是否可以。試試吧,讓我們知道! 「對mysql查詢進行基準測試的最佳方法是什麼?」嘗試在你的數據上運行。有可能兩者都會如此之快以至於無所謂。或者兩者都會很慢,因爲你沒有添加索引。 *用於提高性能的*最重要的事情是添加適當的**索引**。以防萬一你錯過了它:** INDEXES !!! ** –

+0

非常感謝你,夥計。 – beck03076

相關問題