我在桌面上有一个冗长而复杂的mysql查询,其中有很多'其中FieldX喜欢'%ABC%''还有一些'其中FieldX不喜欢'%efg%'。没有做一堆搜索和替换变换喜欢不喜欢,反之亦然,我可以做一些简单的查询来选择不符合大查询参数的记录与那些按照设计的方式进行操作的记录?
简单示例:
Letter
的字段,有26条记录,每个字母对应一个字母。然后我有一个查询说:
Select * from TableA where `Letter` = 'A' or `Letter` = 'B' or `Letter` = 'C' or or `Letter` = 'D' or `Letter` = 'E' or `Letter` = 'F' or `Letter` not like 'G' or `Letter` not like 'H'
现在不是进行搜索而是替换反向/否定我所有的'其中'条件:
Select * from TableA where `Letter` != 'A' or `Letter` != 'B' or `Letter` != 'C' or or `Letter` != 'D' or `Letter` != 'E' or `Letter` != 'F' or `Letter` like 'G' or `Letter` like 'H'
我只想使用现有的查询并获得相同的结果。我想可能有一些方法可以添加一个选择或其他修饰符来选择所有记录但原始选择中的记录:
Select * from TableA where `Letter` != (Select * from TableA where `Letter` != 'A' or `Letter` != 'B' or `Letter` != 'C' or or `Letter` != 'D' or `Letter` != 'E' or `Letter` != 'F' or `Letter` not like 'G' or `Letter` not like 'H')
Cleary我不确定我的最后一个例子是否正在使用Mysql但这是我的目标;将我的原始查询包含在另一个内,最终将返回原始查询中未选择的所有记录。
答案 0 :(得分:1)
首先,在反转比较时,您还必须将or
更改为and
,否则您将获得表格中的所有记录。一切都不是'A'或不是'B'。 :)
应该是:
Select * from TableA where `Letter` != 'A' and `Letter` != 'B' and ...
回到这个问题,我认为最简单的解决方案是将整个条件括在括号中并添加not
运算符:
Select * from TableA where not (`Letter` = 'A' or `Letter` = 'B' or ....)
答案 1 :(得分:0)
只要不涉及where not ()
,GolezTrol的“NULL
”答案就是正确的。您可以尝试这是否有效,但它仅适用于小型表,并且在较大的表上变慢。
select * from TableA as results
where not exists
(
select * from TableA as notResult where notResult.id = results.id and (Letter = 'A or Letter = 'B' ...)
)