SQL Select 语句未按预期与 'like' 一起使用

SQL Select Statement not working with 'like' as expected

以下查询按预期工作并且没有 return 带有 'c' 标志的数据:

SELECT * 
FROM  `func` 
WHERE  `next_act` < 1484870400
AND  `assigned_to` IS NULL
AND `type` like '%FTTC%'
AND  (`flags` NOT LIKE '%c%' OR `flags` IS NULL)
ORDER BY `priority`, `kci3_date`, `kci3_time` ASC
LIMIT 1

当我添加一个额外的 'not like' 时,它开始 return 数据 'c' in flags

SELECT * 
FROM  `func` 
WHERE  `next_act` < 1484870400
AND  `assigned_to` IS NULL
AND `type` like '%FTCT%'
AND  (`flags` NOT LIKE '%c%' OR `flags` NOT LIKE 'w' OR `flags` IS NULL)
ORDER BY `priority`, `date`, `time` ASC
LIMIT 1

你用过 OR 不喜欢。

SELECT * 
FROM  `func` 
WHERE  `next_act` < 1484870400
AND  `assigned_to` IS NULL
AND `type` like '%FTCT%'
AND  ((`flags` NOT LIKE '%c%' 
       AND `flags` NOT LIKE 'w' ) -- Should this be '%w%' ?
     OR `flags` IS NULL)
ORDER BY `priority`, `date`, `time` ASC
LIMIT 1

您还可以使用:

SELECT * 
FROM  `func` 
WHERE  `next_act` < 1484870400
AND  `assigned_to` IS NULL
AND `type` like '%FTCT%'
AND  (NOT (`flags` LIKE '%c%' 
       OR `flags` LIKE 'w' ) -- Should this be '%w%' ?
      OR `flags` IS NULL)
ORDER BY `priority`, `date`, `time` ASC
LIMIT 1

说(不像'xxx'或不像'yyy')意思是'xxx'实际上不像'yyy',所以会return 价值。

您应该将条件与 AND 组合,而不是与 OR 组合。根据您的评论

I want it to show any flags other than c, w or NULL

你想要这样的东西:

  SELECT * 
    FROM `func` 
   WHERE `next_act` < 1484870400
     AND `assigned_to` IS NULL
     AND `type` like '%FTCT%'
     AND  (`flags` <> 'c' AND 
           `flags` <> 'w' AND 
           `flags` IS NOT NULL)
ORDER BY `priority`, 
         `date`, 
         `time` ASC
   LIMIT 1

请注意 flags IS NOT NULL 中的 NOTflags <> 'w' 不是 LIKE ...。您可以将两个 <> 组合成单个 NOT IN:

     ...
   WHERE `next_act` < 1484870400
     AND `assigned_to` IS NULL
     AND `type` like '%FTCT%'
     AND  (`flags` NOT IN ('c', 'w') AND 
           `flags` IS NOT NULL)
     ...

正在使用 'c' returning 数据,因为您使用的是 or 运算符

`flags` NOT LIKE '%c%' OR `flags` NOT LIKE 'w`

它将检查此条件和 return 行,请更正您的查询