首页 > 解决方案 > 在 WHERE 子句中使用“IN”运算符会以某种方式反转子查询的顺序

问题描述

以下是我正在使用的 mysql 查询的一部分,用于在我正在处理的电子商务网站上检索产品的价格规则:

SELECT GROUP_CONCAT(DISTINCT CONCAT(pr.price,',',pr.special,',',pr.sort_order,',',pr.quantity) SEPARATOR ';') AS price_rules 

FROM products AS p LEFT JOIN (
    SELECT DISTINCT ppr.product_id, ppr.price, ppr.special, ppr.sort_order, ppr.quantity
    FROM products_price_rules ppr
    ORDER BY ppr.special DESC, ppr.quantity ASC, ppr.sort_order ASC
) pr ON pr.product_id = p.id

LEFT JOIN products_to_categories cat ON p.id = cat.id
LEFT JOIN products_to_websites ptw ON p.id = ptw.id

WHERE p.status = 1 AND p.id = 277
GROUP BY p.id
LIMIT 1

这将返回以下数组,这是正确的:

数组([0] => 数组([price_rules] => 3.80,1,1,1;5.00,0,0,1 ))

但是,当我稍微更改查询并在 WHERE 子句中添加 IN 运算符时,如下所示:

SELECT GROUP_CONCAT(DISTINCT CONCAT(pr.price,',',pr.special,',',pr.sort_order,',',pr.quantity) SEPARATOR ';') AS price_rules 

FROM products AS p LEFT JOIN (
    SELECT DISTINCT ppr.product_id, ppr.price, ppr.special, ppr.sort_order, ppr.quantity
    FROM products_price_rules ppr
    ORDER BY ppr.special ASC, ppr.quantity DESC, ppr.sort_order DESC
) pr ON pr.product_id = p.id

LEFT JOIN products_to_categories cat ON p.id = cat.id
LEFT JOIN products_to_websites ptw ON p.id = ptw.id 

WHERE p.status = 1 AND cat.category_id IN (77)
GROUP BY p.id
HAVING ( FIND_IN_SET(1, GROUP_CONCAT(pr.special)) )
LIMIT 1

它返回以下内容:

数组([0] => 数组([price_rules] => 5.00,0,0,1;3.80,1,1,1))

数据的顺序以某种方式颠倒了。当我将子查询中的 ORDER BY 子句更改为“ppr.special DESC,ppr.quantity ASC,ppr.sort_order ASC”(DESC 而不是 ASC,反之亦然)时,它会像第一个示例一样返回数据。

为什么会发生这种情况,我做错了什么?

标签: mysqlsqlstringleft-joinsql-order-by

解决方案


我想你ORDER BY 想要 GROUP_CONCAT()

GROUP_CONCAT(DISTINCT 
    pr.price, ',', pr.special, ',', pr.sort_order,',',pr.quantity
    ORDER BY ppr.special DESC, ppr.quantity, ppr.sort_order
    SEPARATOR ';'
) AS price_rules 

请注意,不需要CONCAT()inside GROUP_CONCAT():默认情况下它已经这样做了。

查看查询的其余部分,似乎可以通过多种方式对其进行优化。例如:

  • DISTINCT出现多次,通常没有必要

  • ed 表上的WHERE谓词LEFT JOIN将操作转换为INNER JOIN

  • LIMIT 1withoutORDER BY不会产生一致的结果

如果您要问另一个问题,提供样本数据、所需结果和逻辑解释,那么您可能会提出优化建议。


推荐阅读