我有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
方法的建议。
答案 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))
)
但除非你拥有数亿行,否则你可能会发现查询速度如此之快,即使你使用效率较低的方法,哪种方法最快也无关紧要。
提高效率最重要的是确保您拥有适当的索引。
我建议添加以下索引: