2017-02-07 31 views
1

所以我在我的應用程序中發現了一個錯誤,它沒有向我顯示它應該有的結果。我將其追溯到以下SQL查詢(我刪除了不相關的部分)。錯誤的MySQL子查詢計數比較結果

正如你可以看到該查詢從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行。 。

這怎麼可能?您可以看到count實際上是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'子句中使用同樣的子查詢時,例如'SELECT \'wc_hncat_products \'''''''',(SELECT \'category_id \'...)作爲測試' – Boyd

+0

選項是可以重寫查詢以完全刪除子查詢,而是將'wc_hncat_products'連接到'wc_hncat_product_categories'和'wc_hncat_product_category_has_product',並且將'SELECT'子句連接到'SELECT DISTINCT'以避免返回重複的產品。 –

+0

感謝您的建議,但我正在尋找解釋爲什麼查詢無法正常工作。我真的不明白爲什麼他們不工作。也許它與某些mysql或引擎設置有關。 – Boyd