2017-02-07 2 views
1

Так что я нашел ошибку в своем приложении, это не показало мне результата, который должен иметь. Я проследил его до следующего SQL-запроса (я удалил ненужные части).Неверный результат сравнения счетчика подзапроса MySQL

Как вы можете увидеть запрос выбирает строки из wc_hncat_products которых соответствующие идентификаторы имеют счетчик> = 1 внутри wc_hncat_product_category_has_product таблицы

Если я выполнить запрос с результатом подзапроса в качестве столбца, вы можете увидеть результатом является 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

Нет результатов с сравнения счета подзапросов в ИНЕКЕ 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, что и 'SELECT \' wc_hncat_products \ '. \' id \ ', (SELECT \' category_id \ '...) как test' – Boyd

+0

Другой опция заключается в том, что вы можете переписать запрос для полного удаления подзапроса и вместо этого присоединить 'wc_hncat_products' к' wc_hncat_product_categories' и 'wc_hncat_product_category_has_product' и что ваше предложение SELECT' SELECT DISTINCT', чтобы избежать возврата дубликатов продуктов. –

+0

Спасибо за ваше предложение, но я ищу объяснение, почему запросы не работают. Я действительно не понимаю, почему они не работают. Возможно, это имеет какое-то отношение к некоторым настройкам mysql или engine. – Boyd

Смежные вопросы