【问题标题】:Wrong MySQL subquery count comparison resultMySQL子查询计数比较结果错误
【发布时间】:2017-02-07 14:40:23
【问题描述】:

所以我在我的应用程序中发现了一个错误,它没有向我显示它应该有的结果。我将其追溯到以下 SQL 查询(我删除了不相关的部分)。

如您所见,查询从wc_hncat_products 中选择行,其中对应的 id 在wc_hncat_product_category_has_product 表中的计数>= 1

如果我以子查询结果作为列执行查询,您可以看到结果是1。但是当我在 WHERE 子句中使用它时,>= 1 比较失败。

证明子查询确实返回 1:

SELECT `wc_hncat_products`.`id`, 
   (SELECT Count(*) 
    FROM   `wc_hncat_product_categories` 
           INNER JOIN `wc_hncat_product_category_has_product` 
                   ON `wc_hncat_product_categories`.`id` = 
                      `wc_hncat_product_category_has_product`.`category_id` 
    WHERE  `wc_hncat_product_category_has_product`.`product_id` = 
           `wc_hncat_products`.`id` 
           AND `category_id` IN ( '1' )) count 
FROM   `wc_hncat_products` 
WHERE  `id` IN ( '785' ) 

此查询返回一行,count 列的值为 1

WHERE 子句中没有子查询计数比较结果

SELECT `wc_hncat_products`.`id` 
FROM   `wc_hncat_products` 
WHERE  (SELECT Count(*) 
        FROM   `wc_hncat_product_categories` 
           INNER JOIN `wc_hncat_product_category_has_product` 
                   ON `wc_hncat_product_categories`.`id` = 
                                      `wc_hncat_product_category_has_product`.`category_id` 
            WHERE  `wc_hncat_product_category_has_product`.`product_id` = 
           `wc_hncat_products`.`id` 
           AND `category_id` IN ( '1' )) >= 1 
   AND `id` IN ( '785' ) 

此查询选择 0 行..

这怎么可能?您可以看到计数实际上是 1,但比较仍然失败,因为没有返回任何结果,而子查询在两种情况下都是相同的。

【问题讨论】:

  • 那些小图文我看不懂。
  • 编辑您的问题并将问题中的查询作为 text 传递。您在网站上有足够的经验,应该知道这是个好主意。
  • 我更新了问题以包含代码块。
  • 您使用的是什么版本的 MySQL?您的查询中的 category_idid 列是什么数据类型?
  • Mysql 版本是 5.7.16,这两列都是 INT,但是当我删除 1785 周围的单引号时,没有任何变化

标签: mysql sql


【解决方案1】:

实现这种检查的标准方法是使用EXISTS

这样的东西应该适合你:

SELECT `wc_hncat_products`.`id` 
FROM   `wc_hncat_products` 
WHERE  EXISTS (SELECT NULL 
        FROM   `wc_hncat_product_categories` 
           INNER JOIN `wc_hncat_product_category_has_product` 
                   ON `wc_hncat_product_categories`.`id` = 
                                      `wc_hncat_product_category_has_product`.`category_id` 
            WHERE  `wc_hncat_product_category_has_product`.`product_id` = 
           `wc_hncat_products`.`id` 
           AND `category_id` IN ( '1' )) 
   AND `id` IN ( '785' ) 

【讨论】:

  • 当我把它放在WHERE 子句中时,这仍然没有给我任何结果,但是当我在SELECT 子句中使用相同的子查询时,它确实给了我一个结果,就像SELECT `wc_hncat_products`.`id`, (SELECT `category_id` ...) as test
  • 另一种选择是您可以重写查询以完全删除子查询,而是将wc_hncat_products 连接到wc_hncat_product_categorieswc_hncat_product_category_has_product,并将您的SELECT 子句连接到@987654331 @ 以避免返回重复的产品。
  • 感谢您的建议,但我正在寻找解释为什么查询不起作用。我真的不明白为什么他们不工作。也许它与某些 mysql 或引擎设置有关。
  • 您是否将整个查询粘贴到您的问题中?您说您“删除了不相关的部分”,因此问题可能涉及您未向我们显示的部分查询。
  • 我确实删除了一些不相关的部分,但确实测试了删除这些部分后问题是否仍然存在,并且确实如此。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多