喜欢和不喜欢在mysql查询中

时间:2013-12-10 16:27:40

标签: mysql sql-like

我想做一个包含'like'和'not like'的查询。 当前查询:

SELECT * 
FROM `final` 
WHERE ( `T_Degree` LIKE '%Keyword1%' ) 
  and (`A_Author_Translator_State` NOT LIKE 'Keyword2' 
        or `T_Author` NOT LIKE 'Keyword2' 
        or `T_Author_State` NOT LIKE 'Keyword2' ) 
ORDER BY `Kind` ASC

但这不起作用。有什么提示吗?

3 个答案:

答案 0 :(得分:1)

只需将or更改为and,假设您不希望这三个字段都不像'Keyword2':

SELECT * 
FROM `final` 
WHERE ( `T_Degree` LIKE '%Keyword1%' ) 
  and (`A_Author_Translator_State` NOT LIKE 'Keyword2' 
        and `T_Author` NOT LIKE 'Keyword2' 
        and `T_Author_State` NOT LIKE 'Keyword2' ) 
ORDER BY `Kind` ASC;

顺便说一下,因为您没有使用通配符,所以可以将其标记为:

SELECT * 
FROM final 
WHERE T_Degree LIKE '%Keyword1%' and
      Keyword2 not in (A_Author_Translator_State, T_Author, T_Author_State)
ORDER BY Kind ASC;

答案 1 :(得分:0)

您可能需要更好地澄清您想要实现的目标,但这可能适用于您想要的内容。

SELECT * 
FROM `final` 
WHERE ( `T_Degree` LIKE '%Keyword1%' ) 
  AND NOT (`A_Author_Translator_State` LIKE 'Keyword2' 
        or `T_Author` LIKE 'Keyword2' 
        or `T_Author_State` LIKE 'Keyword2' ) 
ORDER BY `Kind` ASC

答案 2 :(得分:0)

如果你不使用通配符(%),你基本上都在检查两者是否相同。

换句话说:

WHERE `ColumnName` LIKE 'Value' 

与:

相同
WHERE `ColumnName` = 'Value'

(您只能找到“值”和列内容完全相同的记录)

如果要查找ColumnName 包含该值的记录,则需要使用通配符:

WHERE `ColumnName` LIKE '%Value%' 

如果您只想查找ColumnName的值以'值'开头的记录(换句话说,它前面不应该有任何内容),请使用:

WHERE `ColumnName` LIKE 'Value%' 

实施例

让我们考虑一下这个表(名为myTable):

ID | Description
----------------
 1 | Lorem Ipsum dolar sit amet
 2 | Lorem ipsum FooBar dolar sit amet
 3 | FooBar
 4 | Foo Bar

现在这个查询:

SELECT * 
FROM `myTable`
WHERE `Description` LIKE '%FooBar%'

将返回第2行和第3行。 不会返回第1行,因为它不包含'FooBar'。 不会返回第4行,因为它也不包含'FooBar'。 (它确实包含'Foo Bar',但这不一样)

现在让我们看看使用其他查询会发生什么:

SELECT * 
FROM `myTable`
WHERE `Description` LIKE 'FooBar%'

(请注意,<{1}} 之前 FooBar已被删除)

此查询只返回第3行,因为这是以FooBar开始的唯一行。