mysql - 在 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,反之亦然)时,它会像第一个示例一样返回数据。
为什么会发生这种情况,我做错了什么?
解决方案
我想你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 1
withoutORDER BY
不会产生一致的结果
如果您要问另一个问题,提供样本数据、所需结果和逻辑解释,那么您可能会提出优化建议。
推荐阅读
- macos - 需要将 PyCharm 中的 shell 更新为 zsh
- android - 如果我不使用 NDK,我是否需要担心 Android 上的字节顺序?
- java - 使用第三方库的 gradle 没有输出构建
- r - 将缩写词转换为完整词
- pine-script - 是否可以在 pine 脚本研究中计算数字的正弦
- firebase - 如何确定调用或触发 Firebase 函数的特定应用
- html - 如何在图片周围环绕文字
- javascript - 子div上的滚动不完整?
- angular - 角度:类型上不存在属性“管道”
- javascript - 是否有带有用于 roughViz 的事件的 API