mysql SQL在having子句中忽略where条件

11dmarpk  于 2023-04-19  发布在  Mysql
关注(0)|答案(1)|浏览(112)

实际上SQL忽略了having子句中的where条件,我在那里填什么并不重要,它总是找到“所有”的结果。

SELECT `status`, count(*) AS count
FROM `wa_re_jo`
WHERE
    EXISTS (
        SELECT *
        FROM `ad_ac_wa`
        WHERE `plattform` = 'adwords'
        AND `wa_re_jo`.`watchlist_id` = `ad_ac_wa`.`id`
        AND EXISTS (
            SELECT *
            FROM `ad_cu_ac`
            WHERE `ad_ac_wa`.`external_id` = `ad_cu_ac`.`externalId`
            AND EXISTS (
                SELECT *
                FROM `ç`
                WHERE `ad_cu_ac`.`id` = `ad_cu_ac`.`adwords_customer_account_id`
                AND `startDate` <= '2023-04-04'
                AND `endDate` + interval 1 DAY >= '2023-04-04'
            )
        )
    )
AND `created_at` LIKE '2023-04-04%'
OR `updated_at` LIKE '2023-04-04%'
GROUP BY `status`

我试图改变条件的值和顺序。

nue99wik

nue99wik1#

除了**在发布的代码中任何地方都没有HAVING子句,**问题几乎肯定是OR条件表达式:

AND `created_at` LIKE '2023-04-04%'
OR `updated_at` LIKE '2023-04-04%'

你可能需要一组括号,像这样:

AND (`created_at` LIKE '2023-04-04%'
OR `updated_at` LIKE '2023-04-04%')

在原始代码中,只匹配OR子句的右侧就足以匹配整个WHERE子句。也就是说,就像您这样编写WHERE子句一样:

WHERE
  (  EXISTS ( ...    )
      AND `created_at` LIKE '2023-04-04%'
   )
  OR `updated_at` LIKE '2023-04-04%'

我要补充一点,由于文化/国际化问题,使用字符串表达式进行日期比较几乎总是最慢和最容易出错的方法。通过重新使用真实日期表达式进行比较,而不是现在使用的日期表达式,您获得更好更快的结果。
最后,当我看到像这样的多个级别的EXISTS()条件时,这通常是一个信号,应该重新编写以使用JOIN

相关问题