mysql - 错误的MySQL子查询计数比较结果

标签 mysql sql

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

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

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

证明子查询确实返回 1: Proof that the subquery DOES return 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 子句中的子查询计数比较没有结果 No results with subquery count comparison in WHERE clause

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,但是比较仍然失败,因为没有返回任何结果,而两种情况下的子查询都是相同的。

最佳答案

实现这种检查的标准方法是使用 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' ) 

关于mysql - 错误的MySQL子查询计数比较结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42092611/

相关文章:

php - UTF-8贯穿始终

php - 向事件显示表单添加字段

c# - 什么时候写 "ad hoc sql"比存储过程更好

SQL COUNT 个,共 COUNT 个

mysql - 理解MYSQL复合索引

mysql - 在 R 中使用 MySQL - 尝试将变量作为列返回时出现错误

java - "mappedBy reference an unknown target entity property"使用 hibernate

sql - Azure 中具有聚集索引的表出现聚集索引错误

MySQL - 复杂度 : SELECT COUNT(*) FROM MyTable;

sql - 在组内递增计数