2

我有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 选择最低价格。

我想出了以下内容,

方法一:

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 的视图,并在应用程序需要时从视图中查询 MIN(price)。

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

请告诉我方法 1 中的查询是否可以,或者是否可以进一步优化并就该VIEW方法提出建议。

4

2 回答 2

3

您的第一种方法始终选择最低本地价格:您需要添加一个ORDER BY子句以确保LIMIT. 但是,加入查询并将 MySQL 的LEAST()功能与MIN()聚合结合使用会更简单:

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
于 2012-06-03T07:42:36.013 回答
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, 价格)
  • online_price (unique_id , 价格)
于 2012-06-03T07:48:24.363 回答