Php 如何使用多个select查询优化UNION mysql查询?

Php 如何使用多个select查询优化UNION mysql查询?,php,mysql,join,query-optimization,union,Php,Mysql,Join,Query Optimization,Union,我要求在产品详细信息页面中显示类似的产品,这样列出的产品应该以如下所示的分层方式匹配当前的产品属性 尺寸、颜色、类别、公司应与当前产品相匹配 尺寸、颜色、类别应与当前产品相匹配 尺寸、颜色应与当前产品相匹配 尺寸应与当前产品相匹配 我的sql查询如下所示: (SELECT pd.product_id, pd.name, p.price FROM mg_product_description pd JOIN `mg_product` p ON p.pro

我要求在产品详细信息页面中显示类似的产品,这样列出的产品应该以如下所示的分层方式匹配当前的产品属性

  • 尺寸、颜色、类别、公司应与当前产品相匹配
  • 尺寸、颜色、类别应与当前产品相匹配
  • 尺寸、颜色应与当前产品相匹配
  • 尺寸应与当前产品相匹配
  • 我的sql查询如下所示:

    (SELECT pd.product_id, pd.name, p.price 
            FROM mg_product_description pd 
                JOIN `mg_product` p ON p.product_id = pd.product_id 
            WHERE 
                pd.size_id = '33' AND 
                pd.color_id = '2' AND 
                pd.category_id = '3' AND 
                pd.company_id = '1'  AND 
                pd.product_id != '53'  AND 
                p.status = '1' 
                ORDER BY RAND() LIMIT 10 
        )
            UNION
        (SELECT pd.product_id, pd.name, p.price 
            FROM mg_product_description pd 
                JOIN `mg_product` p ON p.product_id = pd.product_id 
            WHERE 
                pd.size_id = '33' AND 
                pd.color_id = '2' AND 
                pd.category_id = '3'  AND 
                pd.product_id != '53'  AND 
                p.status = '1' 
                ORDER BY RAND() LIMIT 10 
        )
            UNION
        (SELECT pd.product_id, pd.name, p.price 
            FROM mg_product_description pd 
                JOIN `mg_product` p ON p.product_id = pd.product_id 
            WHERE 
                pd.size_id = '33' AND 
                pd.color_id = '2' AND 
                pd.product_id != '53'  AND 
                p.status = '1' 
                ORDER BY RAND() LIMIT 10 
        )
            UNION
        (SELECT pd.product_id, pd.name, p.price 
            FROM mg_product_description pd 
                JOIN `mg_product` p ON p.product_id = pd.product_id 
            WHERE 
                pd.size_id = '33' AND 
                pd.product_id != '53' AND 
                p.status = '1'
                ORDER BY RAND() LIMIT 10 
        )
    
    53-当前产品id和状态表示可用

    有没有办法优化上述查询

    注意所需输出量:我们需要10种类似产品。如果存在4个符合条件1的产品,则需要按照随机顺序首先列出。同样,我们需要在下面列出符合其他条件的产品

    提前谢谢

    继续使用ORDER BY RAND()(效率不高),那么一个非常基本的改进就是为每个子句添加优先级,将ORDER子句移到末尾,这样只需要一次

    (SELECT pd.product_id, pd.name, p.price , 1 AS recpriority
            FROM mg_product_description pd 
                JOIN `mg_product` p ON p.product_id = pd.product_id 
            WHERE 
                pd.size_id = '33' AND 
                pd.color_id = '2' AND 
                pd.category_id = '3' AND 
                pd.company_id = '1'  AND 
                pd.product_id != '53'  AND 
                p.status = '1' 
        )
            UNION
        (SELECT pd.product_id, pd.name, p.price , 2 AS recpriority
            FROM mg_product_description pd 
                JOIN `mg_product` p ON p.product_id = pd.product_id 
            WHERE 
                pd.size_id = '33' AND 
                pd.color_id = '2' AND 
                pd.category_id = '3'  AND 
                pd.product_id != '53'  AND 
                p.status = '1' 
        )
            UNION
        (SELECT pd.product_id, pd.name, p.price , 3 AS recpriority
            FROM mg_product_description pd 
                JOIN `mg_product` p ON p.product_id = pd.product_id 
            WHERE 
                pd.size_id = '33' AND 
                pd.color_id = '2' AND 
                pd.product_id != '53'  AND 
                p.status = '1' 
        )
            UNION
        (SELECT pd.product_id, pd.name, p.price , 4 AS recpriority
            FROM mg_product_description pd 
                JOIN `mg_product` p ON p.product_id = pd.product_id 
            WHERE 
                pd.size_id = '33' AND 
                pd.product_id != '53' AND 
                p.status = '1'
        )
        ORDER BY recpriority, RAND() LIMIT 10 
    
    这样做就不需要工会了:-

    SELECT pd.product_id, 
        pd.name, 
        p.price , 
        CASE
            WHEN pd.color_id = '2' AND pd.category_id = '3' AND pd.company_id = '1'  THEN 1 
            WHEN pd.color_id = '2' AND pd.category_id = '3' THEN 2 
            WHEN pd.color_id = '2' THEN 3 
            ELSE 4 
        END AS recpriority
    FROM mg_product_description pd 
    JOIN `mg_product` p ON p.product_id = pd.product_id 
    WHERE pd.size_id = '33' 
    AND pd.product_id != '53' 
    AND p.status = '1'
    ORDER BY recpriority, RAND() 
    LIMIT 10 
    

    ORDER BY RAND()通常比较慢,不过您需要提供解释输出。谢谢您的评论。我已经更新了这个问题。很抱歉不清楚,但我刚才说的“优化”是指上述查询的“提高性能”还是“降低复杂性”?两者都有。优先改善性能!!令人惊叹的!非常感谢:)!是否有其他方法可以选择随机行(…使用ORDER BY RAND()(这是无效的)…是的。我使用了更有效的方法返回一行(基本上是在最小id和最大id之间获得一个随机值,然后选择该随机值上方的第一个id),但不确定在检索10时可以使用哪个方法。这篇文章可能对你决定一个好的随机方法很有用-