【问题标题】:Mysql get lowest price from 3 tables. Improve efficiencyMysql 从 3 个表中获得最低价格。提高效率
【发布时间】:2012-06-07 18:42:13
【问题描述】:

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

方法二:

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

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

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

【问题讨论】:

    标签: mysql join query-optimization min


    【解决方案1】:

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

    【讨论】:

    • 感谢您的回复。我可以礼貌地请您向我解释一下这个查询中的好处吗?在某种程度上,我理解 LEFT JOIN 在这种情况下的必要性。而不是盲目地复制粘贴我想知道的查询,为什么?因为下次我会自己写。再次感谢。
    • @beck03076:只有在价格表中没有匹配记录的情况下,才需要外部联接(相对于内部联接);尽管如此,在这种情况下,LEAST() 会产生一个 NULL 值,所以外部连接实际上并没有增加太多,您可以简单地处理 LEFT 关键字。 PS,我的回答中的“加入”这个词是一个关于加入的好教程的链接。
    【解决方案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,价格)

    【讨论】:

    • 我听说联接比子查询快。我可以对您的答案和eggyal的答案进行基准测试吗?对 mysql 查询进行基准测试的最佳方法是什么?非常感谢您的回答。
    • @beck03076:“我听说连接比子查询快。”有时,但这并不意味着它总是正确的。 “我可以对你的答案和 Eggyal 的答案进行基准测试吗?”我不知道!我知道可以,但我不知道是否可以。试试看,让我们知道! “基准 mysql 查询的最佳方法是什么?”尝试在您的数据上运行两者。很有可能两者都将如此之快以至于无关紧要。或者两者都会很慢,因为您没有添加索引。提高性能最重要的事情是添加适当的索引。以防万一您错过了:INDEXES!!!
    • 连接有时比子查询快。但这只有每个返回 1 行的子查询。而你的另一种方式有 2 个LEFT 加入。我敢打赌,这个 wat 将是最高效的 - 如果将两个 IN 重写为 INNER JOIN,效果会更好。
    猜你喜欢
    • 2014-03-06
    • 2021-11-04
    • 2023-03-20
    • 2021-01-07
    • 2016-01-26
    • 2013-07-21
    • 2019-01-16
    • 2013-04-12
    • 1970-01-01
    相关资源
    最近更新 更多