2017-02-07 16 views
1

私のアプリケーションでバグが見つかりました。結果が表示されませんでした。私はそれを次のSQLクエリに戻しました(無関係な部分を削除しました)。MySQLサブクエリの比較結果が正しくありません

クエリは、対応するIDのはwc_hncat_product_category_has_productテーブル内の> = 1の数を持っているのwc_hncat_productsから行を選択して見ることができるように、私は列とサブクエリの結果でクエリを実行する場合

、あなたが見ることができます結果は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であることがわかりますが、両方のシナリオでサブクエリが同一である間に結果が返されないため、比較はまだ失敗します。

+1

私はそれらの小さな画像のテキストを読むことができません。 – jarlh

+1

あなたの質問を編集して、質問の質問を*テキスト*としてください。あなたは、これが良い考えであることを知っておくべき十分な経験をサイトに持っています。 –

+0

質問を更新してコードブロックを追加しました。 – Boyd

答えて

0

このタイプのチェックを実装する標準的な方法は、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') 
+0

これは 'WHERE'節に入れても結果が得られません。しかし、 'SELECT \' wc_hncat_products \ '。\' id \ 'のように' SELECT'節で同じサブクエリを使用すると結果が得られます。(SELECT \ 'category_id \' ...)as test' – Boyd

+0

'wc_hncat_product_categories'と' wc_hncat_product_category_has_product'に 'wc_hncat_products'を加え、' SELECT'節を 'SELECT DISTINCT'にして重複した商品を返さないようにすることができます。 –

+0

あなたの提案をありがとうが、私はなぜクエリが機能していないのか説明を探しています。私は本当になぜ彼らが働かないのか分からない。たぶんmysqlやエンジンの設定と関係があるかもしれません。 – Boyd

関連する問題