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
中的 NOT
和 flags <> '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 行,请更正您的查询
以下查询按预期工作并且没有 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
中的 NOT
和 flags <> '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 行,请更正您的查询