Mysql从3个表中获得最低价格。提高效率

时间:2012-06-03 07:33:36

标签: mysql join query-optimization min

我有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:

在这3个表上创建一个带有INNER JOIN的VIEW,并在应用程序需要时从视图中查询MIN(价格)。

但是,视图只会在运行时执行查询。

请告诉我方法1中的查询是否正常,或者是否可以进一步优化,以及VIEW方法的建议。

2 个答案:

答案 0 :(得分:3)

您的第一种方法始终选择最低本地价格:您需要添加ORDER BY子句以确保LIMIT选择最小值。MIN()。但是,查询join并将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 聚合结合使用会更简单:

{{1}}

答案 1 :(得分: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(product_id,sub_category_id)
  • local_price(unique_id,price)
  • online_price(unique_id,price)